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

Рассмотрим классы 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?

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


person Codesmith    schedule 09.01.2013    source источник
comment
Вы имеете в виду Синглетон?   -  person Code-Apprentice    schedule 09.01.2013
comment
@OliCharlesworth Сделал ли этот компилятор, я бы посчитал очень плохим судьей в этих делах ...   -  person paul23    schedule 09.01.2013
comment
Упс! сори да 'Синглтон'   -  person Codesmith    schedule 09.01.2013
comment
@ paul23: Это никоим образом не окончательно, но это было бы началом... ;)   -  person Oliver Charlesworth    schedule 09.01.2013


Ответы (1)


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

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

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

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

class Singleton{
private:

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

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

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

person Karthik T    schedule 09.01.2013
comment
спасибо! Но должен ли я должен сделать myFunction общедоступным? Я мог бы добавить к нему вызов в какой-нибудь общедоступной функции в A, но, думаю, это не имеет значения. - person Codesmith; 09.01.2013
comment
@AUTO ага, вам НЕ ОБЯЗАТЕЛЬНО делать это общедоступным, я должен был вызвать его из основного. - person Karthik T; 09.01.2013
comment
Для вашего примера Singleton требуется или необязательно указывать: Singleton& GetInstance() const? - person Codesmith; 09.01.2013
comment
@AUTO Ах!! Я пропустил это, функция должна быть статической, поэтому const не имеет смысла. - person Karthik T; 09.01.2013