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


У меня был класс перечисления, скажем

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 2

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;