无效使用不完整类型和转发声明

时间:2014-05-29 08:41:38

标签: c++ qt forward-declaration

我试图解决这个问题但是我必须对如何解决前方声明存在一些误解。

我收到以下错误:

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;
...

2 个答案:

答案 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