c ++ определение типа объекта с помощью enum - PullRequest
0 голосов
/ 04 февраля 2012

У меня есть базовая настройка:

enum{
    BASE,
    PRIMITIVE,
    ...
};

class IUnknown{
public:
    bool inline is(int type){return inv_type == type;}
private:
    enum {inv_type = BASE};
};

class Primitive: public IUnkown{
private:
    enum {inv_type = PRIMITIVE};
};

Моя проблема в том, что я хотел бы иметь возможность вызова на экземпляре Primitive, и он должен иметь значение true, если тип равен значению в перечислении, которое я объявил в классе Primitive.

Единственное решение, которое я нашел, это объявить функцию ' is ' как виртуальную и иметь копию в каждом подклассе, но я подумал, можно ли как-то переопределить перечисление и получить функция в IUnkown принимает значение оттуда

Ответы [ 3 ]

1 голос
/ 04 февраля 2012

Ваш класс IUnknown может определять защищенный конструктор (который затем должен вызываться из каждого производного класса). Было бы взять одно из значений enum и сохранить его. Затем сохраненное значение будет сравниваться с методом is ().

Если вам это не нравится и вы предпочитаете добавить виртуальный метод is () в IUnknown, но не хотите определять его в каждом производном классе, вы можете сделать это:

template <int Tinv_type>
class IUnknownT : public IUnknown{
public:
    virtual bool is(int type){return inv_type == type;}
protected:
    enum {inv_type = Tinv_type};
};

class Primitive: public IUnknownT<PRIMITIVE>{
};
1 голос
/ 04 февраля 2012

enum сами по себе не занимают место для хранения, потому что это просто списки допустимых значений для переменной enum. Вам необходимо иметь некоторое хранилище во время выполнения, чтобы виртуальная функция работала с типом объекта во время выполнения. Я бы просто использовал int или что-то еще:

enum{
    BASE,
    PRIMITIVE,
    ...
};

class IUnknown{
public:
    bool is(int type) const {return inv_type == type;}

protected:
    IUnknown(int type) : inv_type(type) { }

private:
    const int inv_type;
};

class Primitive: public IUnkown{
private:
    Primitive() : IUnknown(PRIMITIVE) { }
};
0 голосов
/ 04 февраля 2012

Почему бы не сделать все возможное и использовать строки вместо перечислений.

const char * baseStr = "base";
const char * derived1Str = "derived1";
const char * derived2Str = "derived2";

class base
{
public:
    virtual bool is(const char * str)
    {
        return strcmp(baseStr, str) ? false : true;
    }
};

class derived1 : public base
{
public:
    bool is(const char * str)
    {
        if ( strcmp(derived1Str, str) )
            return base::iA(str);

        return true;
    }
};

class derived2 : public derived1
{
public:
    bool is(const char * str)
    {
        if ( strcmp(derived2Str, str) )
            return derived1::is(str);

        return true;
    }
};

Это имеет то преимущество, что

base * b = new derived2();
bool is = b->isA(baseStr);

устанавливает is в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...