2

我有枚举课,说

enum class Enum{
   var1, var2;
}

现在我想添加一些取决于参数 ie 的成员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。此外,在这里有公共构造函数并不是一个好主意。

有什么想法吗?

4

2 回答 2

1

解决方案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);
}

你可以在这里看到一个活生生的例子。唯一的缺点是您不能将类的名称用于命名空间。

于 2012-11-03T20:24:14.100 回答
0

你可以写一个这样的类:

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;
于 2012-11-04T00:19:50.787 回答