Проблема с доступом к переменным после применения шаблона
Есть некоторая рабочая программа, нужно применить паттерн одиночка на эту программу. При моей попытке использовать его, выдает ошибку:
нарушение прав доступа при чтении по адресу 0x00000000
Как я понял, проблема в ссылочной переменной, но не могу понять конкретнее, а очень хотелось бы.
Сократил максимально программу, чтобы было явно видно в чем проблема
#include <iostream>
using namespace std;
class Test
{
private:
static Test* p_instance;
Test() {}
Test(const Test&);
Test& operator=(Test&);
int N = 5;
public:
static Test* getInstance() {
if (!p_instance)
p_instance = new Test();
return p_instance;
}
void func1()
{
cout << "N = ";
cin >> N;
}
};
Test* p_instance = 0;
int main()
{
Test::getInstance()->func1();
return 0;
}
UPD: сделал правку в коде по замечанию комментатора, изначально обращался к p_instance напрямую.
UPD2: То что отмечено как ответ актуально только для обращения к p_instance, код в вопросе после UPD тоже рабочий, прошу прощения за такую путаницу
Ответы (1 шт):
Ну, во-первых, ваше
Test* p_instance = 0;
не имеет отношения к
static Test* p_instance;
из класса. Правильно надо объявлять вот так:
Test* Test::p_instance = 0;
И тогда все будет нормально :)
Но еще лучше спрятать ваш синглтон еще дальше:
static Test* getInstance()
{
static Test * p_instance = nullptr;
if (!p_instance)
p_instance = new Test();
return p_instance;
}
Или даже
static Test& getInstance()
{
static Test p_instance;
return p_instance;
}