指向类方法的静态指针(如果可能并且有意义的话)



通常对于singleton类,必须始终编写以下内容:

SomeSingleton::GetInstance().someVariable

我正在寻找一个随处可见的简化,因此应该放在类本身的(头和源(文件中。

所以,(不工作的(东西应该看起来像这样:

SomeSingleton.hp:

class SomeSingleton {
//...
static SomeSingleton& GetInstance();
};
SomeSingleton& (*INSTANCE)();

SomeSingleton.cpp:

SomeSingleton& (* INSTANCE)() = SomeSingleton::GetInstance;

但这被误解为一种重新定义,所以不起作用。如果声明和定义在同一行,这将起作用,但在任何地方使用的头中都不会起作用。将指针分配给已经声明的INSTANCE变量不会比简单地定义INSTANCE中使用的每个文件更简单。

一个变通方法是放置一条线路

static SomeSingleton& (*INSTANCE)() = SomeSingleton::GetInstance;

在我使用的每个文件中,并将每个SomeSingleton::GetInstance替换为INSTANCE,这很有效,但并不理想。此外,从设计角度来看,我不确定将一个singleton分配给一个静态变量是否明智(从某种意义上说,将一个静态的东西分配给另一个静态东西(。

对此有什么想法吗?

我认为您唯一缺少的是标头中的extern

extern SomeSingleton& (*INSTANCE)();

我通常尝试在没有singleton的情况下进行设计(并使用依赖注入(,这对单元可测试性更好。但在真正需要的时候,我会使用这种模式。您还应该阅读Meyer的singleton模式。

// header file 
struct SomeSingleton
{
int value{ 42 };
};
SomeSingleton& GetGlobalInstance();
// cpp file
SomeSingleton& GetGlobalInstance()
{
static SomeSingleton data;
return data;
}
// some other cpp file
int main()
{
return GetGlobalInstance().value;
}

相关内容

最新更新