Проблема с доступом к переменным после применения шаблона

Есть некоторая рабочая программа, нужно применить паттерн одиночка на эту программу. При моей попытке использовать его, выдает ошибку:

нарушение прав доступа при чтении по адресу 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 шт):

Автор решения: Harry

Ну, во-первых, ваше

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;
}
→ Ссылка