具有重载访问器函数的Singleton上的C++未解析外部
C++ Unresolved External on Singleton Having Overloaded Accessor Function
我在C++程序中遇到一个未解决的外部符号错误。我在下面提供了MCVE。
Foo
类的构造函数需要一个int
参数。我希望Foo
是一个单例对象。
在Foo
类中,我创建了两个访问器函数,用于检索指向singleton对象的指针。第一个传递int
参数以允许构造对象。第二个不需要参数,以便允许不知道参数的代码访问对象。
当尝试在main()
中创建Foo
的实例时,该错误发生在链接时。
有没有更好的方法可以做到这一点,最重要的是为了避免错误,(不太重要的是)为了使Foo
接口不会强加第二个访问器不能在第一个访问器之前被调用的不幸要求?
#include <assert.h>
class Foo {
public:
// Accessor function initializes m_param, and
// returns pointer to singleton.
static Foo* GetInstance (int *param)
{
// Foo singleton object is instantiated on first call
// to this function
static Foo instance (param);
pInstance = &instance;
return pInstance;
}
// Overloaded version of GetInstance() that may be called
// after first calling static Foo* GetInstance(int *param).
static Foo* GetInstance ()
{
// This alerts us if the other GetInstance() was not called first.
assert (pInstance);
return pInstance;
}
private:
// constructor
Foo (int *param)
: m_param (*param)
{}
// private var
int m_param;
// pointer to singleton object
static Foo* pInstance;
};
// initialize static var
Foo* pInstance = static_cast<Foo*>(nullptr);
int main(int argc, char* argv[])
{
int pInt;
Foo* pFoo = Foo::GetInstance (&pInt);
return 0;
}
要修复链接错误,请更改
Foo* pInstance = static_cast<Foo*>(nullptr);
至
Foo* Foo::pInstance = static_cast<Foo*>(nullptr);
或者更好:
Foo* Foo::pInstance = nullptr;
查看此链接以获得深入的解释
有关使用Singleton模式的最佳方法的深入讨论,请参阅本文:
相关文章:
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 物理键盘上的触发器按键
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 集合上的输出迭代器:assign和increment迭代器
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 对于set上的循环-获取next元素迭代器
- 如何从棋盘上的箱号中找到行和列
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- if数组上的随机数
- 向量上的线性搜索
- 位阵列上的快速AND运算
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 为什么一个向量上的多线程操作很慢
- 64位机器上的C++内存对齐
- 跟踪滚动条上的鼠标事件