enums — C ++ Как определить статический член, у какого класса есть приватный конструктор?

Я пытаюсь имитировать перечисление Java в C ++, поэтому я создал код, который выглядит следующим образом (конечно, я удалил все, что не связано с моим вопросом):

MyEnum.hpp

MyEnum
{
public:
class Value1;
class Value2;

static Value1 VALUE1;
static Value2 VALUE2;

private:
MyEnum(std::string name);
};

class MyEnum::Value1 public MyEnum
{
private:
Value1();
};

class MyEnum::Value2: public MyEnum
{
private:
Value2();
};

Я сделал конструкторы частными, чтобы единственным экземпляром значений перечисления были статические члены BaseEnum. Как их определить?

MyEnum.cpp

MyEnum::Value1 VALUE1=MyEnum::Value1();

Это дает мне

error: calling a private constructor of class 'MyEnum::Value1'

РЕДАКТИРОВАТЬ:
Это было слишком просто. Я просто забыл добавить MyEnym :: к значениям. Одна из многих мелких повседневных проблем, с которыми я сталкиваюсь, когда возвращаюсь в C ++ из Java. Кроме того, в коде моего вопроса я забыл добавить объявление друга, которое было в моем исходном коде. Спасибо за ваши ответы.

0

Решение

Прежде всего, чтобы ответить на ваш вопрос: правильный текст в

MyEnum.cpp

является:

MyEnum::Value1 MyEnum::VALUE1;

Но это все равно не сработает, потому что вы автоматически не друг своего родителя. Так и добавь

friend class MyEnum;

в декларации class MyEnum::Value1

0

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

Предполагая, что вы не используете C ++ 11 для этого, вот решение — подружить классы друг с другом, чтобы класс Enum мог создавать экземпляры подклассов, а подклассы могли вызывать конструктор базового класса, я также добавил недостающие части, чтобы сделать код компилируется:

class MyEnum
{
public:
class Value1;
class Value2;

friend class Value1;
friend class Value2;

static Value1 VALUE1;
static Value2 VALUE2;

private:
MyEnum(std::string name) {}
};

class MyEnum::Value1 : public MyEnum
{
friend class MyEnum;
private:
Value1() : MyEnum("VALUE1") {}
};

class MyEnum::Value2 : public MyEnum
{
friend class MyEnum;
private:
Value2() : MyEnum("VALUE2") {}
};

MyEnum::Value1 MyEnum::VALUE1;
MyEnum::Value2 MyEnum::VALUE2;

int main()
{
// Use statuc enum value
MyEnum::Value1 &someValue = MyEnum::VALUE1;

return 0;
}
1

Объявление чего-то как частного означает, что только ученики и друзья имеют к нему доступ, но не его базовый класс и не его дети. Поэтому, объявляя конструкторы закрытыми, вы предотвращаете создание экземпляров в любом месте, кроме класса и его друзей.
Если вы действительно хотите, чтобы MyEnum имел доступ к закрытым членам своих детей, вы должны определить его как друга в каждом из них:

friend class MyEnum;
0
По вопросам рекламы [email protected]