C++ Unerlaubte Verwendung eines inkompletten Typs

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich habe ein Problem mit einem Programm und ich komme einfach nicht darauf, warum es nun nicht mehr funktioniert. Ich habe einige Änderungen daran vorgenommen, sehe aber nicht, aus welchem Grund es nun fehlerhaft ist.

Hier mal etwas Code:

script.h:
Code:
#include "mainwindow.h"
//...
class MainWindow; //forward declaration

class Script
{
//...
private:
//...
static int l_pushButton ( lua_State *L)
    {
         QString label = lua_tostring(L, 1);
         int column = lua_tonumber(L, 2);
         int row = lua_tonumber(L, 3);

        MainWindow *temp = MainWindow::getMW();
        temp->newGrapic(1, label, row, column);

        return 0;
    }

    static int l_lineEdit ( lua_State *L)
    {
         QString label = lua_tostring(L, 1);
         int column = lua_tonumber(L, 2);
         int row = lua_tonumber(L, 3);

        MainWindow *temp = MainWindow::getMW();
        temp->newGrapic(2, label, row, column);

        return 0;
    }

//...
Es handelt sich hier um den Header einer Klasse, die Funktionen werden von Lua aus aufgerufen, das ist aber für das Problem unerheblich.
getMW(); wird in mainwindow.h definiert:
Code:
#include "script.h"
//...
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
//...
 void  newGrapic(int, QString, int, int);
 static MainWindow *getMW () {return toMW;}
//...
private:
static MainWindow *toMW;
//...
};

mainwindow.cpp:
Code:
#include "mainwindow.h"
//...
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    toMW=this;
}

Nun habe erhalte ich folgende Fehlermeldungen:
In file included from mainwindow.h:10,
from main.cpp:3:
script.h: In static member function »static int Script::l_pushButton(lua_State*)«:
script.h:60: Fehler: incomplete type »MainWindow« used in nested name specifier
script.h:61: Fehler: invalid use of incomplete type »struct MainWindow«
script.h:14: Fehler: forward declaration of »struct MainWindow«
script.h: In static member function »static int Script::l_lineEdit(lua_State*)«:
script.h:72: Fehler: incomplete type »MainWindow« used in nested name specifier
script.h:73: Fehler: invalid use of incomplete type »struct MainWindow«
script.h:14: Fehler: forward declaration of »struct MainWindow«
make: *** [main.o] Fehler 1

Ich habe den Code wie gesagt früher erfolgreich compilieren können, auch damals hatte ich schon diese statischen Funktionen und getMW().
Ich frage mich aber, was hier der Fehler ist. Ich habe schon einige Zeit darauf verwendet ihn zu finden - erfolglos.

Vielleicht weiß ja jemand weiter.


Vielen Dank.

Gruß,

badday
 
Du hast zirkulär inkludiert (script.h, main.h).

Du hast ja schon gesehen, dass du in script.h eine Forwarddeklaration "brauchst". Allerdings kann der Code darunter nicht kompilieren (der Teil temp->newGrapic), weil MainWindow zu diesem Zeitpunkt incomplete ist.

Stell dir einfach mal vor, wie sich die Dateien gegenseitig includieren und dann die Includeguards greifen. Fang mit main.h an und dann wirst du es verstehen.

Das eigentliche Problem dabei ist: Der Code, in dem der Fehler auftritt, hat im Header nix verloren. Einfach keinen Code in Headerdateien packen, sondern immer alles schön sortiert in Cpp-Files (gibt auch Ausnahmen - Templates, minimalistische Getter/Setter - aber das ist die Faustregel). Dann sind nämlich beide Header inkludiert und es gibt kein Problem.
 
Zurück
Oben