我希望这是一个连贯的问题...我有一个单例类定义,例如:
#include A.h
class Singleton
{
public:
// If I change this to a return by pointer, it works fine. But reference gives me problems.
static Singleton &getInstance();
Singleton(Singleton const&) = delete;
void operator=(Singleton const&) = delete;
~Singleton();
friend void A::friendMethodinA();
private:
Singleton();
void methodOnlyNeededByA();
}
类定义为:
Singleton &Singleton::getInstance()
{
static Singleton instance;
return instance;
}
Singleton::~Singleton() {}
Singleton::Singleton() {}
void Singleton::methodOnlyNeededByA() { // method body. }
我的A类声明是:
#pragma once
class Singleton;
class A
{
public:
void friendMethodinA();
private:
// This is what I'm not sure about. I tried
// Singleton &mSingleton = Singleton::getInstance(); This gives me "use of undefined type 'Singleton'" error. I can't #include Singleton.h because of the friend function.
// Singleton mSingleton = Singleton::getInstance(); This gives me "cannot be reference -- it is a deleted function" error.
Singleton mSingleton; // This gives me "A::mSingleton uses undefined class 'Singleton'" error.
}
我真的很想通过引用而不是指针b返回单例,以避免空检查和每次我使用指针时都取消引用。有没有没有完全重构避免使用好友功能的方法?
此朋友功能的目的是方法methodOnlyNeededByA()
。由于只需要A类调用它,因此我不想将其放在Singleton的公共接口中。
答案 0 :(得分:5)
您可以通过以下方法解决编译器错误:
使用引用类型作为成员变量。
Singleton& mSingleton;
然后
在构造函数中初始化它。
但是,我想指出的更重要的一点是:不要使用Singleton
类型的成员变量。当您需要使用该类时,只需调用Singleton::getInstance()
。您可以将对返回对象的引用存储在函数局部变量中,也可以只使用返回的引用。
auto& ref = Singleton::getInsance();
ref.methodOnlyNeededByA();
或
Singleton::getInsance().methodOnlyNeededByA();