LINUX.ORG.RU

Пустой класс. Ну вот совершенно пустой. Может стоит как-то иначе?

 , ,


0

3

Представьте себе ситуацию: есть ящики, в ящиках могут быть гвозди, бананы или коты. Очевидно что между гвоздями, бананами и котами общего ничего нет. А ящики стандартные и должны хранить указатель на содержимое.
Ну и что я делаю? Я создаю класс «содержимое», от которого будут наследоваться гвозди, бананы и коты.
Вот только эти классы настолько разные, что в базовый класс вообще нечего вынести.
Такой вот совершенно пустой класс, нужный лишь для приведения типов.
Сижу вот ржу.
Работать-то будет конечно, но может Чаушеску (или как там его) придумал какой-то более элегантный финт ушами? А то чувствую себя явистом с их любовью к иногда странной иерархии.

★★☆

Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от anonymous

состоящее-из-функций/рекурсий/аккумуляторов-прям-как-в-цэ

когда на «цэ» пишут как на хацкеле, лучше уже никогда больше не писать на «цэ» а писать только на хацкеле.

ckotinko ☆☆☆
()

а вообще, знаешь в чем твоя проблема

Вот только эти классы настолько разные, что в базовый класс вообще нечего вынести.

твоя проблема в том, что тебе НАДО что-то вынести в базовый класс. а достаточно только виртуального деструктора и type_index из с++11.

понадобится - вынесешь туда вес, например, объем, цвет и т.д.

но проблему ты создал сам в своей голове и

Сижу вот ржу.

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

НАДО

? Если бы это надо надо было бы, то я бы это сделал.

проблему ты создал сам

Где проблема-то? Боюсь что только у тебя в голове.

Сижу вот ржу.

Смех это признак проблем? /me facepalm

Stahl ★★☆
() автор топика
Ответ на: комментарий от ckotinko

когда на «цэ» пишут как на хацкеле

... то получается получше, чем когда на «цэ» как на java.

anonymous
()
Ответ на: комментарий от ckotinko

Ты просто немного туповат и не понял о чём тред.

Stahl ★★☆
() автор топика
#include <stdint.h>

typedef struct GUID 
{
    uint32_t Data1;
    uint16_t Data2;
    uint16_t Data3;
    uint8_t  Data4[8];
} GUID;

typedef int32_t HRESULT;

#define S_OK 0
#define S_FALSE 1
#define E_FAIL ((HRESULT)0x80004005)
#define E_NOINTERFACE ((HRESULT)0x80004002)
#define E_OUTOFMEMORY ((HRESULT)0x8007000E)
#define E_POINTER ((HRESULT)0x80004003)

// {00000000-0000-0000-C000-000000000046}
static const GUID IID_IUnknown = 
{ 0x00000000, 0x0000, 0x0000, { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } };

// {0E441999-658D-4E25-8439-F02FD91AA3EA}
static const GUID IID_ICat = 
{ 0xe441999, 0x658d, 0x4e25, { 0x84, 0x39, 0xf0, 0x2f, 0xd9, 0x1a, 0xa3, 0xea } };

// {A0C7DEA4-6C44-4B17-95B6-02E399764C73}
static const GUID IID_INail = 
{ 0xa0c7dea4, 0x6c44, 0x4b17, { 0x95, 0xb6, 0x2, 0xe3, 0x99, 0x76, 0x4c, 0x73 } };

// {09236D97-31D0-4094-AF84-7ACF2A98A9FD}
static const GUID IID_IBanana = 
{ 0x9236d97, 0x31d0, 0x4094, { 0xaf, 0x84, 0x7a, 0xcf, 0x2a, 0x98, 0xa9, 0xfd } };

#if defined(_MSC_VER) && defined(__cplusplus) && !defined(CINTERFACE)

typedef const GUID& REFIID;

struct __declspec(novtable) __declspec(uuid("00000000-0000-0000-C000-000000000046")) IUnknown
{
    virtual HRESULT __stdcall QueryInterface(REFIID riid, void** ppOut) = 0;
    virtual uint32_t __stdcall AddRef() = 0;
    virtual uint32_t __stdcall Release() = 0;
};

struct __declspec(novtable) __declspec(uuid("0E441999-658D-4E25-8439-F02FD91AA3EA")) ICat
{
    virtual HRESULT __stdcall Meow() = 0;
};

// ...etc.. interfaces
//
// impl:

#include <new>
#include <iostream>
#include <memory.h>

class Cat : ICat
{
private:
    int _refcount;


public:

    Cat()
    {
        _refcount = 0;
    }

    virtual ~Cat()
    {
    }

    HRESULT __stdcall QueryInterface(REFIID riid, void** ppOut)
    {
        if(memcmp(&riid, &IID_IUnknown, sizeof(GUID)) == 0)
        {
            AddRef();
            *ppOut = (void*)(IUnknown*)this;
            return S_OK;
        }
        else if(memcmp(&riid, &IID_ICat, sizeof(GUID)) == 0)
        {
            AddRef();
            *ppOut = (void*)(ICat*)this;
            return S_OK;
        }
        else
        {
            return E_NOINTERFACE;
        }
    }

    uint32_t __stdcall AddRef()
    {
        return _refcount++;
    }

    uint32_t __stdcall Release()
    {
        uint32_t tmp = _refcount--;
        if(tmp == 0)
        {
            delete this;
        }
        return tmp;
    }

    HRESULT __stdcall Meow()
    {
        std::cout << "Meow!" << std::endl;
        return S_OK;
    }

};

extern "C" HRESULT __stdcall CreateCat(ICat** ppOut)
{
    if(!ppOut) return E_POINTER;

    Cat * cat = new (std::nothrow) Cat();

    if(!cat) return E_OUTOFMEMORY;

    return cat->QueryInterface(IID_ICat, (void**)ppOut);
}

// etc impl...

#else // not MSVC++

#ifndef __stdcall // Non-Window platform
#define __stdcall
#endif

typedef const GUID * REFIID;

struct IUnknown;

typedef struct IUnknown IUnknown;

struct IUnknownVtbl
{
    HRESULT(__stdcall *QueryInterface)(IUnknown * This, REFIID riid, void** ppOut);
    uint32_t(__stdcall *AddRef)(IUnknown * This);
    uint32_t(__stdcall *Release)(IUnknown * This);
};

struct IUnknown
{
    const struct IUnknownVtbl *lpVtbl;
};

struct ICat;

typedef struct ICat ICat;

struct ICatVtbl
{
    HRESULT(__stdcall *QueryInterface)(ICat * This, REFIID riid, void** ppOut);
    uint32_t(__stdcall *AddRef)(ICat * This);
    uint32_t(__stdcall *Release)(ICat * This);
    HRESULT(__stdcall *Meow)(ICat * This);
};

struct ICat
{
    const struct ICatVtbl *lpVtbl;
};

// ...etc interfaces and impl..

#endif // __MSC_VER
lovesan ★★★
()
Ответ на: комментарий от lovesan

<<<

struct __declspec(novtable) __declspec(uuid("0E441999-658D-4E25-8439-F02FD91AA3EA")) ICat

>>>

struct __declspec(novtable) __declspec(uuid("0E441999-658D-4E25-8439-F02FD91AA3EA")) ICat : IUnknown

<<<

if(tmp == 0)

>>>

if(tmp == 1)
lovesan ★★★
()
Последнее исправление: lovesan (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.