我试图解决这个问题但是我必须对如何解决前方声明存在一些误解。
我收到以下错误:
src/algorithm.cpp: In constructor ‘Algorithm::Algorithm(MainWindow*)’:
src/algorithm.cpp:22:20: error: invalid use of incomplete type ‘struct Ui::MainWindow’
src/mainwindow.h:23:10: error: forward declaration of ‘struct Ui::MainWindow’
我有这些文件(我省略了一些行和文件,只粘贴了相关的代码):
algorithm.cpp
#include "algorithm.h"
#include "mainwindow.h"
Algorithm::Algorithm(MainWindow *mainWindow)
{
this->mainWindow = mainWindow;
QAction *action = new QAction(this);
action->setObjectName(QStringLiteral("action"));
action->setText(this->getName());
mainWindow->m_ui->menuAlgorithms->addAction(action);
mainWindow->connect(action, SIGNAL(triggered()), this, SLOT(this->start()));
}
algorithm.h
#ifndef ALGORITHM_H
#define ALGORITHM_H
#include <QObject>
#include "graphwidget.h"
#include "edge.h"
#include "vertex.h"
class MainWindow;
class Algorithm : public QObject
{
public:
MainWindow *mainWindow;
Algorithm(MainWindow *mainWindow);
void start();
virtual void solve();
virtual QString getDescription();
virtual QString getName();
};
mainwindow.cpp
#include "mainwindow.h"
#include "algorithm.h"
#include "../ui/ui_mainwindow.h"
#include "vertex.h"
#include "edge.h"
#include "warning.h"
mode_type mode;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
m_ui(new Ui::MainWindow)
{
gundirected = NULL;
gdirected = NULL;
m_ui->setupUi(this);
...
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QSignalMapper>
#include <QUndoView>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QKeyEvent>
#include <QGraphicsSceneMouseEvent>
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
#include "graphwidget.h"
enum mode_type {NORMAL, VERTEX, EDGE}; // vyctovy typ pro urceni editoacniho modu
extern mode_type mode;
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *m_ui;
...
答案 0 :(得分:4)
您的转发声明出现在命名空间UI
中,但您的类声明显示在此命名空间之外。你应该把它改成
namespace UI {
class MainWindow : public QMainWindow {
Q_OBJECT
// ...
};
}
您似乎根本不需要在那里提供转发声明,但是再次更改Algorithm.h
中的转发声明,使其在正确的命名空间中显示为MainWindow
:
namespace UI {
class MainWindow;
}
答案 1 :(得分:4)
您的代码中的问题是,您尝试在m_ui
课程中使用MainWindow
课程的Algorithm
成员,且m_ui
的类型为{ {1}},但您的Ui::MainWindow
班级并不知道此类型。您可以在Algorithm
中添加ui_mainwindow.h
来解决此问题。
但这仍然是糟糕的设计。 algorithm.cpp
应该是m_ui
类的私有成员。您不应该从其他类访问它。而是在MainWindow
课程中创建功能,以便您可以执行所需的操作。
例如,创建一个这样的公共函数:
MainWindow
然后从void MainWindow::addCustomAction(QAction *action)
{
m_ui->menuAlgorithms->addAction(action);
}
班级中调用此函数:
Algorithm