在c++中,如何从单独的源文件中使用单例
In C++, how to use a singleton from a separate source file?
我试图在一个大型系统上编译一些其他人的包装程序,其中它使用来自另一个文件的全局对象,类的定义如下:
class __declspec(dllexport) A
{
...
static A * instance;
}
在我单独的源文件中(我想构建一个。exe),我包括头文件A.h,并在开始时声明如下
A * A::instance;
访问a中的数据
问题是,这段代码可以在Linux上成功构建,现在当我试图在windows NT中构建它时,它会出现问题。
如果我这样做,编译器会报错一个
C2491 error, definition of dllimport function not allowed
。如果我删除这行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设为友元。
- 为什么在单例中,检查类==空?
- C++ 实现模板单例类时出现链接错误
- 在类中存储单例的指针
- C++中的单例实现在调用 getInstance 函数时不会产生相同的类实例
- 具有非默认构造函数的单例类
- 使用 std::call_once 实现类似单例的功能
- 为什么单例使用指针而不是引用?
- 提升单例池release_memory vs purge_memory
- 具有 QObject 继承的单例 - Qt
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- C++单例,不会为此文档加载任何符号
- 使用 CRTP 实现单例
- C++单例模板类使我的程序崩溃
- 初学者C++线程安全单例设计
- 派生类是单例是否是一种好的做法
- _CrtIsValidHeapPointer(块)错误在应用单例-帕特恩后退出主窗口时引发
- 在这种单例实施中,是否可以对两个商店重新排序?
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- C++ 单例实现 迈耶与call_once
- 在c++中,如何从单独的源文件中使用单例