在C ++中,如何使用单独源文件中的单例?

时间:2011-11-22 23:22:57

标签: c++ visual-studio dll dllimport

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

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

  3. 不太清楚这里有什么问题,我在网上做了一些研究,但找不到一个好的答案,我自己也不熟悉dll导入/导出和一些C ++技巧。有人可以提供一些问题的见解,或者我应该花时间去解决这个问题吗?

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

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

4 个答案:

答案 0 :(得分:1)

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

extern A *A::instance;

这表示变量A::instance是在其他地方定义的,但是你告诉编译器它,所以你可以在这个文件中按名称使用它。

答案 1 :(得分:0)

当您想要在DLL中导出函数时,使用

__ declspec(dllexport)。只要您没有从另一个DLL调用该类,就没有必要这样做。

但我怀疑你的问题与使用.c文件而不是类规范有关。试着读一下这个。它讨论了dllexport的详细信息Windows & C++: extern & __declspec(dllimport)

答案 2 :(得分:0)

Singleton通常有一个函数,比如

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

如果你有这样的函数,你不必直接访问A :: instance。

抱歉,你在做什么?在C程序中包含C ++头?它甚至可以编译吗?

答案 3 :(得分:0)

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

如果你想强制执行一些事情,你可以为A private构建一个构造函数,并使getInstance成为朋友。