2013-11-01 52 views
0

未解決的錯誤,我需要幫助搞清楚什麼錯了代碼:LNK2019:在singletone

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:static class DatabaseEngine & __cdecl DatabaseEngine (?0UsersWindow @@ QAE @ PAVQWidget @@@ Z)

在函數「public:__thiscall UsersWindow :: UsersWindow(class QWidget *)」中引用的「:: instance(void)」(?instance @ DatabaseEngine @@ SAAAV1 @ XZ)在函數「public:__thiscall UsersWindow :: UsersWindow」中引用的無效外部符號「public:void __thiscall DatabaseEngine :: do_something(void)」(?do_something @ DatabaseEngine @@ QAEXXZ)

userswindow.obj:-1:error:LNK2019: (類QWidget的*)」(?? 0UsersWindow @@ QAE @ PAVQWidget @@@ Z)

感謝

+1

對我來說,它看起來像DatabaseEngine的cpp文件不包含在項目中,因此Visual Studio不編譯該代碼。 – drescherjm

+0

順便說一句,我認爲這是兩個答案都提到的錯誤的原因之一。我看到你的.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; 
    } 
}; 
class DatabaseEngine 
{ 
public: 
    static DatabaseEngine& instance(){ 
     static DatabaseEngine db; 
     return db; 
    } 
};