Расширенный перечислимый класс

У меня был enum класс, скажем

enum class Enum{
var1, var2;
}

Теперь я хочу добавить некоторый член, который зависит от параметра, т.е. var3(int), ОК, это не для enum, поэтому я хочу изменить его обычным классом, но моя цель — оставить старый код (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);
}

Ты можешь видеть живой пример здесь. Единственным недостатком является то, что вы не можете использовать имя класса для пространства имен.

1

Другие решения

Вы можете написать такой класс:

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;
0

По вопросам рекламы [email protected]