我试图在不分配内存的情况下实现单例设计模式。我尝试搜索解决方案,但似乎每个解决方案都是针对使用内存分配定义的单个实例。
我将构造函数设为私有,添加到头文件中以使其成为单例设计模式的唯一代码是:
static ParametersServerPC& ParametersServerPC::GetInstance() {
static ParametersServerPC instance;
return instance;
}
这是从ParametersServerABS
具有空构造函数定义的基类派生的类。ParametersServerABS
是一个抽象类。
当我尝试ParametersServerPC
在单独的文件中实例化一个类时:
ParametersServerPC& paramServer = ParametersServerPC::GetInstance();
我收到此错误:
undefined reference to `ParametersServerPC::GetInstance()'
以下是.cpp
和.hpp
文件:
parameters_server_abs.hpp:
#ifndef PARAMETERS_SERVER_ABS_HPP_
#define PARAMETERS_SERVER_ABS_HPP_
class ParametersServerABS {
public:
ParametersServerABS();
~ParametersServerABS();
virtual bool Load() = 0;
};
#endif
parameters_server_abs.cpp:
#include "mid_level/parameters_server_abs.hpp"
ParametersServerABS::ParametersServerABS() {}
ParametersServerABS::~ParametersServerABS() {}
parameters_server_pc.hpp:
#ifndef PARAMETERS_SERVER_PC_HPP_
#define PARAMETERS_SERVER_PC_HPP_
#include <string>
#include "mid_level/parameters_server_abs.hpp"
class ParametersServerPC: public ParametersServerABS {
public:
~ParametersServerPC();
static ParametersServerPC& GetInstance();
virtual bool Load();
private:
ParametersServerPC(std::string parameterFileName = "parameters.txt");
std::string _parameterFileName;
};
parameters_server_pc.cpp:
#include "mid_level/parameters_server_pc.hpp"
ParametersServerPC::ParametersServerPC(std::string parameterFileName = "parameters.txt") :
_parameterFileName(parameterFileName) {
}
ParametersServerPC::~ParametersServerPC() {
}
static ParametersServerPC& ParametersServerPC::GetInstance() {
static ParametersServerPC instance;
return instance;
}
virtual bool ParametersServerPC::Load() {
return true; // TODO
}
my_test_file.cpp
#include "mid_level/parameters_server_pc.hpp"
ParametersServerPC& paramServer = ParametersServerPC::GetInstance();
未定义对“ ParametersServerPC :: GetInstance()”的引用
这似乎是链接器错误。如果您可以发布编译控制台的输出,则可以进一步缩小范围。
同时,您可以检查构建系统,并查看是否从编译中省略了一些源文件。
在单例模式上,已经有一些不错的答案。有关模式的描述以及有关单例的一般性问题,更多关于该主题的信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句