У меня был 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. Кроме того, не очень хорошая идея иметь здесь публичного конструктора.
Какие-нибудь мысли?
Решение 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;