从具有正向声明的类中向具有朋友功能的已声明单身类转发

时间:2019-05-26 04:54:22

标签: c++ c++11 return singleton friend-function

我希望这是一个连贯的问题...我有一个单例类定义,例如:

#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的公共接口中。

1 个答案:

答案 0 :(得分:5)

您可以通过以下方法解决编译器错误:

  1. 使用引用类型作为成员变量。

    Singleton& mSingleton; 
    

    然后

  2. 在构造函数中初始化它。

但是,我想指出的更重要的一点是:不要使用Singleton类型的成员变量。当您需要使用该类时,只需调用Singleton::getInstance()。您可以将对返回对象的引用存储在函数局部变量中,也可以只使用返回的引用。

auto& ref = Singleton::getInsance();
ref.methodOnlyNeededByA();

Singleton::getInsance().methodOnlyNeededByA();