Я пытаюсь реализовать шаблон проектирования singleton без выделения памяти. Я попытался найти решение, но похоже, что каждое решение предназначено для одного сингла, определенного с распределением памяти.C++ Singleton: `Undefined reference to` error
Я сделал конструктор приватным и единственный код, который я добавил в файл заголовка, чтобы сделать это синглтон шаблон дизайна был:
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()' отлично выглядит, но в определении не требуется 'static'. –
'ParametersServerABS' - абстрактный класс, из которого получен класс' PC'. Сейчас у него есть публичный конструктор и деструктор. Наряду с виртуальной функцией, которую я еще не определил. Код для GetInstance() в классе 'PC' находится в файле заголовка. Сейчас все, что у него есть, - это публичный деструктор и частный конструктор. –
@VictorPolevoy Конечно, 1 сек. –