LNK2019: неразрешенная ошибка в синглтоне

мне нужна помощь, чтобы понять, что не так в этом коде:

class DatabaseEngine
{
protected:
    DatabaseEngine();
    static DatabaseEngine* m_DatabaseEngine;
public:
    static DatabaseEngine& instance();
    void do_something();
};

cpp:

#include "databaseengine.h"

DatabaseEngine* DatabaseEngine::m_DatabaseEngine=nullptr;

DatabaseEngine::DatabaseEngine()
{
}


static DatabaseEngine& DatabaseEngine:: instance()
{
    if(m_DatabaseEngine==nullptr)
{
    m_DatabaseEngine=new DatabaseEngine;`enter code here`
}
return *m_DatabaseEngine;
}

void DatabaseEngine::do_something()
{

}

userwindow.cpp:

#include "databaseengine.h"
UsersWindow::UsersWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UsersWindow)
{
    ui->setupUi(this);
    DatabaseEngine::instance().do_something();
}

UsersWindow::~UsersWindow()
{
    delete ui;
}

userswindow.obj: -1: ошибка: LNK2019: неразрешенный внешний символ "public: статический класс DatabaseEngine & __cdecl DatabaseEngine :: instance (void)" (? instance @ DatabaseEngine @@ SAAAV1 @ XZ) упоминается в функции "public: __thiscall UsersWindow: : UsersWindow (класс QWidget *) "(?? 0UsersWindow @@ QAE @ PAVQWidget @@@ Z)

userswindow.obj: -1: ошибка: LNK2019: неразрешенный внешний символ "public: void __thiscall DatabaseEngine :: do_something (void)" (? do_something @ DatabaseEngine @@ QAEXXZ) упоминается в функции "public: __thiscall UsersWindow :: UsersWindow (класс QWidget *) "(?? 0UsersWindow @@ QAE @ PAVQWidget @@@ Z)

Благодарность


person Omer Bar    schedule 01.11.2013    source источник
comment
Мне кажется, что файл cpp для DatabaseEngine не включен в проект, поэтому Visual Studio не компилирует этот код.   -  person drescherjm    schedule 02.11.2013
comment
Кстати, одна из причин, по которой я подумал, что это ошибка, упоминаемая в обоих ответах. Я видел, что ваш файл .cpp не может быть скомпилирован. Итак, если у вас нет ошибок, вы либо разместили неправильный код, либо файл не был частью вашего проекта.   -  person drescherjm    schedule 02.11.2013


Ответы (3)


Я думаю, вам нужно удалить ключевое слово static из определения статической функции:

Неправильный:

static DatabaseEngine& DatabaseEngine::instance()

Верный:

DatabaseEngine& DatabaseEngine::instance()
person vahancho    schedule 01.11.2013

декларация:

static DatabaseEngine& DatabaseEngine::instance();
   ^
only in declaration

определение:

DatabaseEngine& DatabaseEngine:: instance() {
   // code here
}

также убедитесь, что файл DatabaseEngine.cpp включен в ваш проект и компилируется

person 4pie0    schedule 01.11.2013

Вы можете использовать статическую переменную в экземпляре статического метода для хранения уникального экземпляра и возврата указателя. Я думаю, это тоже хороший совет от Effective C ++. Пример не тестировался, но должен работать

class DatabaseEngine
{
public:
    static DatabaseEngine& instance(){
        static DatabaseEngine db;
        return db;
    }
};
person Giuseppe Puoti    schedule 13.10.2017