2013-11-01 2 views
0

мне нужна помощь, чтобы выяснить, что не так об этом коде:LNK2019: неразрешенный ошибка в singletone

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

каст:

#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: static class 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)

благодаря

+1

Мне кажется, что файл cpp для DatabaseEngine не включен в проект, поэтому Visual Studio не компилирует этот код. – drescherjm

+0

BTW, Одна из причин, по которым я думал, что это была ошибка, о которой упоминаются оба ответа. Я видел, что ваш .cpp-файл не может скомпилироваться. Поэтому, если у вас нет ошибок, вы либо разместили неправильный код, либо файл не был частью вашего проекта. – drescherjm

ответ

2

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

Неправильно:

static DatabaseEngine& DatabaseEngine::instance() 

Правильно:

DatabaseEngine& DatabaseEngine::instance() 
0

декларация:

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

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

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

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

0

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

class DatabaseEngine 
{ 
public: 
    static DatabaseEngine& instance(){ 
     static DatabaseEngine db; 
     return db; 
    } 
}; 
Смежные вопросы