Invalid use of incomplete Type (in Qt)
-
Dein Compiler kennt an der Fehlerstelle nur die Vorwärtsdeklaration von Ui::Sudoku, nicht aber die Klassendefinition. Entweder es fehlt der entsprechende Header, oder du hast den Klassennamen nicht überall gleich geschrieben (groß/klein).
-
Ok, also das hab ich überprüft da stimmt alles!
Nur damit ich das richtig verstehe, die Forward-Deklaration ist dann in der sudoku.h-datei: Ui::Sudoku *ui; oder?
Oder ist das die Klassendefinition?Wie gesagt ich bin kein Informatiker sondern habe außer einem Programmierkurs in c++ nie objektorientiert programmiert

-
Dein Problem ist, dass du eine Klasse Ui::Sudoku Forward-deklarierst (und auch benutzt), diese wird aber nirgendwo konkret definiert.
-
Ok

Also meine Frage wäre dann wieso es bei fehler.cpp, gewonnen.cpp keinen Fehler gibt da ich es dann dort auch nicht definieren!
Muss diese Deklaration dann in Sudoku.h?Also tut mir leid wenn ich davon jetzt keine Ahnung habe!
-
Nille88 schrieb:
Ok, also das hab ich überprüft da stimmt alles!
Wenn alles stimmen würde, dannn würden ja wohl weder wir noch der Compiler das Gegenteil behaupten. Wem glaubst du mehr, deinen eigenen Fähigkeiten oder dem Rest der Welt?Nur damit ich das richtig verstehe, die Forward-Deklaration ist dann in der sudoku.h-datei: Ui::Sudoku *ui; oder?
Oder ist das die Klassendefinition?Weder noch. Wenn du Wörter nicht verstehst, dann schlag sie nach. Und lern die Grundlagen von Klassen. Die Foward-Deklaration steht hier im Forum in Zeile 30. Eine Defintion hast du wie gesagt gar nicht.
Wie gesagt ich bin kein Informatiker sondern habe außer einem Programmierkurs in c++ nie objektorientiert programmiert

Informatiker programmieren nicht (unbedingt). Aber man sieht, dass duu Schwierigkeiten mit objektorientierung hast. Vielleicht erst einmal Grundlagen lernen undeinfache Beispiele machen? Sonst endest du wie der berüchtigte Programmierbuchautor Jürgen Wolf und programmierst, dass ein Supermarkt eine Wurst ist. Du hast hier in deinem Programm praktisch schon behauptet, dass ein Sudoku ein Fenster ist.
-
Nille88 schrieb:
Also meine Frage wäre dann wieso es bei fehler.cpp, gewonnen.cpp keinen Fehler gibt da ich es dann dort auch nicht definieren!
Muss diese Deklaration dann in Sudoku.h?Meistens reicht eine Forward-Deklaration, also die Kenntnis, dass eine Klasse mit diesem Namen existiert. Erst wenn du ein Objekt konkret benutzt, muss der Compiler wissen, wie es genau aussieht und braucht die Definition. Wenn du in diesen Dateien nur Zeiger oder Referenzen auf ui:Sudoku benutzt, dann reicht die Forward-Deklaration.
-
Nille88 schrieb:
Ok

Also meine Frage wäre dann wieso es bei fehler.cpp, gewonnen.cpp keinen Fehler gibt da ich es dann dort auch nicht definieren!
Muss diese Deklaration dann in Sudoku.h?Also tut mir leid wenn ich davon jetzt keine Ahnung habe!
Woher sollen wir das wissen? Du hast den Code ja nicht gezeigt. Wenn du dort jedoch auf Ui::Sudoku zugreifst, machst du auf jeden Fall etwas falsch.
Nach Qt-Logik müsste die Klasse jedenfalls in ui_sudoku.h definiert werden.
-
Ja wie gesagt bin neu im Qt-Programmieren!
Was mir eben nicht so klar ist, es lief ja alles wunderbar bis ich irgendetwas in sudoku.cpp verändert habe! Und wenn die Deklaration in fehler.h oder gewonnen.h falsch wäre dann hätte es dort aber vorher ja auch schon einen Fehler geben (da ich nach dem Fehler dort nichts verändert habe!) jedoch ist der Aufbau ja gleich!
Im file ui_sudoku.h habe ich nichts verändert, da es laut den Hinweisen automatisch generiert wird!
#ifndef UI_SUDOKU_H #define UI_SUDOKU_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QHeaderView> #include <QtGui/QMainWindow> #include <QtGui/QWidget> #include <QGridLayout> QT_BEGIN_NAMESPACE class Ui_sudoku { public: QWidget *fenster; void setupUi(QMainWindow *Sudoku) { if (Sudoku->objectName().isEmpty()) Sudoku->setObjectName(QString::fromUtf8("sudoku")); Sudoku->resize(800, 600); fenster = new QWidget(Sudoku); fenster->setObjectName(QString::fromUtf8("fenster")); Sudoku->setCentralWidget(fenster); retranslateUi(Sudoku); QMetaObject::connectSlotsByName(Sudoku); } // setupUi void retranslateUi(QMainWindow *Sudoku) { Sudoku->setWindowTitle(QApplication::translate("Sudoku", "MainWindow", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; namespace Ui { class Sudoku: public Ui_sudoku {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_SUDOKU_H
-
Was auch immer du da tust, es ist wirr. Laut deinem Code definierst du in fehler.h und in sudoku.h jeweils eine Klasse Sudoku. Diese Header werden in sudoku.cpp eingebunden. Trotzdem soll nur der Fehler zu Ui::Sudoku gemeldet werden. Das halte ich für sehr unwahrscheinlich ...
-
Jungs, tut mir leid eure Geduld strapaziert zu haben! Es geht!
Danke