Расширенный класс перечисления
У меня был класс перечисления, скажем
enum class Enum{
var1, var2;
}
Теперь я хочу добавить некоторый член, который зависит от параметра i. e var3(int)
. Хорошо, это не для перечисления, поэтому я хочу изменить его обычным классом, но моя цель-оставить старый код(Enum::var1
Как значение типа Enum
) возможным для компиляции.
Я попытался сделать это так(давайте временно забудем о var3
, это будет статическая функция):
class Enum{
public:
const static Enum var1 = Enum(1);
const static Enum var2 = Enum(2);
private:
Enum(int v):v(v){
}
int v;
//operator == using v
};
Но он не компилируется, потому что Enum имеет неполный тип.
Я не могу объявить его после занятий, потому что он находится в заголовок, так что он не будет работать с несколькими cpp. кроме того, это не очень хорошая идея, чтобы иметь публичный конструктор здесь.
Есть какие-нибудь мысли?
2 ответа:
Решение 1:
Для задачи со статическими переменными: объявите статические переменные в объявлении класса:
class Enum { public: static const Enum var1; static const Enum var2; Enum(int v):v(v) { } private: int v; //operator == using v };
Затем создайте исходный файл для этого класса,
Enum.cpp
, содержащий:#include "Enum.h" const Enum Enum::var1 = Enum(1); const Enum Enum::var2 = Enum(2);
Решение 2:
Если вы хотите, чтобы он был только заголовочным, вы можете использовать статические переменные вместо переменных класса:
class Enum { public: Enum(int v):v(v) { } private: int v; }; namespace Enumeration // It is not possible to name it 'Enum' { // static => local to translation unit. No linking conflict static const Enum var1 = Enum(1); static const Enum var2 = Enum(2); }
Вы можете увидетьживой пример здесь . Единственный недостаток заключается в том, что вы не можете использовать имя класса для пространство имен.
Вы можете написать такой класс:
class Enum { public enum NestedEnum : int { var1, var2 }; static NestedEnum var3; Enum(NestedEnum value) : value(value) { } operator NestedEnum() const { return value; } private: NestedEnum value; };
И в любом другом месте вы можете объявить:
Enum::var3 = (Enum::NestedEnum)someIntegerVariable;