在c++中,如何从单独的源文件中使用单例

In C++, how to use a singleton from a separate source file?

本文关键字:源文件 单例 单独 c++      更新时间:2023-10-16

我试图在一个大型系统上编译一些其他人的包装程序,其中它使用来自另一个文件的全局对象,类的定义如下:

class __declspec(dllexport) A
{
...
static A * instance;
}

在我单独的源文件中(我想构建一个。exe),我包括头文件A.h,并在开始时声明如下

A * A::instance;

访问a中的数据

问题是,这段代码可以在Linux上成功构建,现在当我试图在windows NT中构建它时,它会出现问题。

  1. 如果我这样做,编译器会报错一个C2491 error, definition of dllimport function not allowed

  2. 如果我删除这行A声明,我将得到很多错误LNK2001: unresolved external symbol

不太确定这里的问题是什么,我在网上做了一些研究,但找不到一个好的答案,我自己也不熟悉dll导入/导出和一些c++技巧。有人能就这个问题提供一些见解吗?或者我应该把时间花在哪个方向上?

或者说,如果我已经有了这样一个静态对象,我想写另一个程序来访问它,我该怎么做呢?

如果我在这里有任何错误,也请纠正我。谢谢!

我认为你需要的关键字是extern,如:

extern A *A::instance;

这表示变量A::instance是在其他地方定义的,但是您告诉编译器有关它的信息,因此您可以在此文件中通过名称使用它。

__declspec(dllexport)用于在DLL中导出函数。只要你不从另一个DLL调用这个类,就不需要这样做。

但我怀疑你的问题是有关使用。c文件,而不是类规范。顺便读一下这个。它非常详细地讨论了导出。c++: extern &使用__declspec (dllimport)

单例通常有一个函数,如

A::instance = NULL;
A * get_instance() {if (!A::instance) A::instance = new A; return A::instance;}

如果你有这样一个函数,你不需要直接访问a::instance

对不起,你在做什么?在C程序中包含c++头文件?它能编译吗?

我个人通常将实例隐藏在.cpp文件中的匿名命名空间中。然后我提供一个getInstance()函数,该函数返回指向它的指针或引用,并对该函数进行dllExport。

如果你想强制某事,你可以将A的构造函数设为私有,并将getInstance设为友元。