【问题标题】:Extern class declaration in Qt5Qt5 中的外部类声明
【发布时间】:2016-07-23 19:06:02
【问题描述】:

在我的 Qt5.7 程序中,我正在尝试实施来自this 帖子(@vz0 答案)的解决方案。 我想从 Settings 类访问我的 MainWindow 类函数,但出现链接器错误。请告诉我,我做错了什么?

片段:

主要:

MainWindow w; //MainWindow declaration
a.setActivationWindow(&w);
w.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);

主窗口.h:

public:    
static MainWindow* getInstance() { return &mainwindowInstance; }
void trayReload();
void tray();

private:
static MainWindow mainwindowInstance;

主窗口.cpp:

void MainWindow::trayReload()
{
delete trayIcon;
MainWindow::tray();
}

settings.cpp:

void Settings::bar()
{
MainWindow* mainWin = MainWindow::getInstance();
mainWin->trayReload(); //I want to make this working
}

编译这段代码后我得到了这个错误:

settings.obj:-1: error: LNK2001: unresolved external symbol "private: static class MainWindow MainWindow::mainwindowInstance" (?mainwindowInstance@MainWindow@@0V1@A)

在这种情况下我应该怎么做才能使其正常工作?

【问题讨论】:

标签: c++ qt class linker


【解决方案1】:

您对静态类成员的使用不完整。 看看标题中的这一行:

static MainWindow mainwindowInstance;

所有这些都是声明mainwindowInstance。您需要定义它(实例化它)。您可以在您的mainwindow.cpp 中执行此操作:

MainWindow MainWindow::mainwindowInstance;

请注意,您不能在头文件中执行此操作,因为这样您最终会得到多个实例。

我建议一个完全不同的设计:通过类中的指针存储实例,为实例设置一个setter并在main()中创建它,所以你也可以在main()中删除它。

【讨论】:

  • 请不要回答exact duplicates的问题。作为明智的版主,您被要求投票结束问题。
  • 好的,我该怎么做呢?当我添加 MainWindow MainWindow::mainwindowInstance; 时,编译器说,QWidget:必须在 QWidget 之前构造一个 QApplication,当我将它放在 Widget 构造函数中时,编译器说这是一个重新定义。
  • 这就是为什么我建议使用 setter 并在 main() 中创建它。然后,您可以按照 Qt 指南的方式先创建应用程序,然后再创建窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多