【问题标题】:LNK2019: unresolved error in singletoneLNK2019:单音中未解决的错误
【发布时间】:2013-11-13 04:57:30
【问题描述】:

我需要帮助找出代码有什么问题:

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()
{

}

用户窗口.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: error: LNK2019: unresolved external symbol "public: static class DatabaseEngine & __cdecl DatabaseEngine::instance(void)" (?instance@DatabaseEngine@@SAAAV1@XZ) 在函数“public: __thiscall UsersWindow::UsersWindow(class QWidget *)" (??0UsersWindow@@QAE@PAVQWidget@@@Z)

userswindow.obj:-1: error: LNK2019: unresolved external symbol "public: void __thiscall DatabaseEngine::do_something(void)" (?do_something@DatabaseEngine@@QAEXXZ) 在函数“public: __thiscall UsersWindow::UsersWindow”中引用(类 QWidget *)" (??0UsersWindow@@QAE@PAVQWidget@@@Z)

谢谢

【问题讨论】:

  • 对我来说,项目中似乎没有包含 DatabaseEngine 的 cpp 文件,因此 Visual Studio 没有编译该代码。
  • 顺便说一句,我认为这是两个答案都提到的错误的原因之一。我看到您的 .cpp 文件无法编译。因此,如果您没有收到任何错误,您要么发布了错误的代码,要么该文件不是您项目的一部分。

标签: c++ qt lnk2019


【解决方案1】:

我认为您需要从静态函数定义中删除 static 关键字:

错误:

static DatabaseEngine& DatabaseEngine::instance()

正确:

DatabaseEngine& DatabaseEngine::instance()

【讨论】:

    【解决方案2】:

    声明:

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

    定义:

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

    还要确保 DatabaseEngine.cpp 文件包含在您的项目中并且正在编译

    【讨论】:

      【解决方案3】:

      您可以在静态方法实例中使用静态变量来保存唯一实例并返回指针。我认为这也是来自 Effective C++ 的明智建议。该示例未经测试,但应该可以工作

      class DatabaseEngine
      {
      public:
          static DatabaseEngine& instance(){
              static DatabaseEngine db;
              return db;
          }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-12
        • 2014-05-14
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 2013-01-31
        • 2015-01-11
        相关资源
        最近更新 更多