Рассмотрим класс 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?
В качестве дополнительного вопроса, как связан метод Синглтона? Имеет ли дело конкретно создание экземпляра одного и только одного экземпляра объекта или это что-то еще?
Ваш код (больше похоже на вашу идею) на самом деле без ошибок и действителен как для 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()
,
Эта и другие возможные реализации показаны на Википедия.
Других решений пока нет …