Utilisation invalide de type incomplète et en avant de la déclaration de
J'ai essayé de résoudre ce problème mais il doit y avoir un malentendu dans la façon de comprendre avant de déclaration.
J'obtiens l'erreur suivante:
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’
J'ai ces fichiers (j'ai omis certaines lignes et les fichiers et collé uniquement code correspondant):
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()));
}
algorithme.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;
...
OriginalL'auteur alop789312 | 2014-05-29
Vous devez vous connecter pour publier un commentaire.
Le problème dans ton code, c'est que vous tentez d'utiliser le
m_ui
membre deMainWindow
classe dans votreAlgorithm
classe, et le type dem_ui
estUi::MainWindow
, mais votreAlgorithm
classe n'est pas au courant de ce type. Vous pouvez résoudre ce problème en incluant laui_mainwindow.h
dans votrealgorithm.cpp
.Mais c'est toujours une mauvaise conception.
m_ui
doit être un membre privé deMainWindow
classe. Vous ne devriez pas accéder à d'autres classes. Au lieu de créer des fonctions dans votreMainWindow
classe qui vous permettra de faire ce que vous voulez.Par exemple, créer une fonction publique comme ceci:
Puis appeler cette fonction à partir de votre
Algorithm
classe:OriginalL'auteur thuga
Votre déclaration apparaît dans l'espace de noms
UI
, mais votre déclaration de classe apparaît à l'extérieur de cet espace de noms. Vous devriez changer celaIl semble aussi que vous n'avez pas besoin de fournir une déclaration anticipée, mais le changement de la déclaration anticipée en
Algorithm.h
nouveauMainWindow
dans le droit de l'espace de noms:Vous devez spécifier l'espace de noms pour votre définitions aussi bien sûr. Soit joindre tous vos définitions dans votre
.cpp
fichier avecnamespace UI { ... }
ou de fournir une instruction d'utilisation etusing UI::MainWindow;
avant toutes les définitions.Ce n'est pas la façon dont il devrait fonctionner.
Ui::MainWindow
n'est pas le même queMainWindow
.Ui::MainWindow
classe est déclarée dans leui_mainwindow.h
fichier. Le problème, c'est qu'il est d'essayer d'utiliserUi::MainWindow
deAlgorithm
classe sans y compris leui_mainwindow.h
en-tête.Je sais qu'il ya plus que cela failles dans le cas des OP des exemples de code. Je viens de remarquer qu'à résoudre pour le tout. N'hésitez pas à ajouter une autre réponse, d'aller plus en profondeur sur l'autre minerai de problèmes ultérieurs.
OriginalL'auteur πάντα ῥεῖ