Я пытаюсь имитировать перечисление 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. Кроме того, в коде моего вопроса я забыл добавить объявление друга, которое было в моем исходном коде. Спасибо за ваши ответы.
Прежде всего, чтобы ответить на ваш вопрос: правильный текст в
MyEnum.cpp
является:
MyEnum::Value1 MyEnum::VALUE1;
Но это все равно не сработает, потому что вы автоматически не друг своего родителя. Так и добавь
friend class MyEnum;
в декларации class MyEnum::Value1
Предполагая, что вы не используете 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;
}
Объявление чего-то как частного означает, что только ученики и друзья имеют к нему доступ, но не его базовый класс и не его дети. Поэтому, объявляя конструкторы закрытыми, вы предотвращаете создание экземпляров в любом месте, кроме класса и его друзей.
Если вы действительно хотите, чтобы MyEnum имел доступ к закрытым членам своих детей, вы должны определить его как друга в каждом из них:
friend class MyEnum;