Может ли класс друга вызвать приватный конструктор в C++? (и что такое синглтон)

Рассмотрим класс A и B. Класс A подружился с классом B. Класс B имеет собственный конструктор. Может ли класс A создавать экземпляры класса B, или частный конструктор указывает компилятору, что класс не может быть создан даже классом-другом?
Вот пример кода:

class B;

class A {
    void myFunction() {
        B newBobject;
    }
};

class B {
    private:
        B() {}
    public:
        int someData;
        friend class A;
};

Также обратите внимание, что я использую C++03. Если это недопустимо в C++03, разрешено ли это в C++11?

В качестве дополнительного вопроса, как связан метод Синглтона? Имеет ли дело конкретно создание экземпляра одного и только одного экземпляра объекта или это что-то еще?

1 ответ

Решение

Ваш код (больше похожий на вашу идею) фактически свободен от ошибок и действителен как на C++03, так и на C++ 11.

Однако в вашем коде есть 2 ошибки. Чтобы создать объект типа B, вам нужно увидеть полное определение B, а это означает, что определения B и A необходимо заменить.

Во-вторых, вам нужно сделать myfunction общедоступный или позвоните из класса А.

Чтобы ответить на ваш другой вопрос.. Большинство синглетонов реализовано примерно так...

class Singleton{
private:

   Singleton(){}
public:
   static Singleton& GetInstance(){
       static Singleton instance;
       return instance;
   }
};

Это не позволило бы никому, кроме класса Singleton (и друга, как вы обнаружили), создать экземпляр этого класса, поэтому легче применять правило 1 объекта. Синглтон будет доступен как Singleton::GetInstance(),

Эта и другие возможные реализации показаны в Википедии.

Другие вопросы по тегам