Может ли класс друга вызвать приватный конструктор в 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()
,
Эта и другие возможные реализации показаны в Википедии.