Мне нужно получить доступ к общедоступному перечислению, принадлежащему другому классу, для упрощения, примерно так:

class obj
{
public:

    enum Type
    {
        t1,
        t2,
        t3
    };

    Type type;
};

class otherObj
{
public:

    void setType(obj* o);

};

void otherObj::setType(obj* o)
{
    o->type = obj::Type::t1;
    return;
}

Как мне это сделать, потому что линия

o->type = obj::Type::t1;

Выдает ошибку:

obj::Type is not a class or namespace.
-1
V0ldek 8 Мар 2015 в 17:03

3 ответа

Лучший ответ
obj::t1
obj::t2
obj::t3

Разве перечисления C ++ не прекрасны? Значения попадают в область над ними, даже если перечисление можно рассматривать как тип.

1
Rollen 8 Мар 2015 в 14:06

В C ++ 03 значения перечисления принадлежат охватывающей области. Следовательно, замена obj::Type::t1 на obj::t1 подойдет вам.

Это несколько нелогично и решается функцией enum class в C ++ 11, которая помещает значения перечисления непосредственно в область действия перечисления. Таким образом, если вы используете enum class в компиляторе, совместимом с C ++ 11, тогда вы сможете использовать obj::Type::t1, как вы это делаете сейчас.

0
Masked Man 8 Мар 2015 в 14:09

Вы либо просто используете

obj::t1;

Или укажите атрибут class в объявлении enum

enum class Type {
    t1,
    t2,
    t3
};
0
πάντα ῥεῖ 8 Мар 2015 в 14:07