Richtiger Umgang mit namespace ?
-
Dein Forwarddeklaration sagt, dass es eine Klasse Ui::MyDialog gibt. Die verwendest Du dann auch. Offensichtlich hast Du sie aber nicht deklariert. Bei "new Ui::MyDialog" weiss der Compiler, dass es die Klasse gibt, aber nicht wie sie aussieht.
-
Finnegan schrieb:
Wenn ich Qt noch richtig in Erinnerung habe, sollte eine
ui_MyDialog.hautomatisch generiert worden sein (bzw. muss mit einem entsprechenden Kommandozeilen-Tool manuell aus der.ui-Datei erzeugt werden), in derUi::MyDialogausdefiniert ist.
Ich denke diese Header-Datei sollte spätenstens in der.cpp-Datei eingebunden werden, da eine Klasse vollständig definiert sein muss bevor man sie (wie in diesem Fall mitnew) instanziert.
FinneganGenau, hab ich vergessen zu pasten, sorry:
#include "ui_mydialog.h"steht in der zwiten Zeile im *.cpp
Und in dieser dann:
QT_BEGIN_NAMESPACE class Ui_MyDialog { public: QVBoxLayout *verticalLayout; QPushButton *pushButton; // setupUi // retranslateUi }; namespace Ui { class MyDialog: public Ui_MyDialog {}; } // namespace Ui QT_END_NAMESPACE
-
Darüber hinaus: Wir hatten letztens die Diskussion, ob man namespaces so einsetzen sollte, wie du es tust, und kamen zu dem Schluss, dass das wsl nicht so gut ist.
In Java werden Packages automatisch organisiert, da sie in die IDE eingebunden werden. Man kann leicht Klassen aus anderen namespaces integrieren und das auch über die IDE automatisieren lassen, wenn sich etwas ändert.
In C++ gibt es die ganze Hilfestellung nicht. Wenn du einen Unter-namespace woanders hinschiebst, musst du viel ändern. Und in den Header-Dateien musst du stets den ganzen Wulst an namespace-Bezeichnern mitschleppen.
Das kann in einigen Fällen sinnvoll sein wie in Bibliotheken bei boost, unnötige namespaces würde ich jedoch vermeiden. Ein namespace "com" ergibt in meinen Augen absolut keinen Sinn in C++.
Edit, zu deinem Problem: QT_BEGIN_NAMESPACE erzeugt natürlich noch einen zusätzlichen namespace drum herum. Lass es am besten einfach weg, denn du nutzt es meiner Ansicht nach nicht so, wie man es benutzen sollte. Das ist ein Spezialfall für Konfigurationen, bei denen mehrere QT-Versionen miteinander in Konflikt geraten können: https://wiki.qt.io/Qt_In_Namespace
-
Eisflamme schrieb:
Darüber hinaus: Wir hatten letztens die Diskussion, ob man namespaces so einsetzen sollte, wie du es tust, und kamen zu dem Schluss, dass das wsl nicht so gut ist.
Einiges von diesem Namespace-Gewusel (
Uiet al.) wird allerdings schon von Qt so erzeugt. Dass Namespaces in C++ so umständlich zu organisieren sind, halte ich allerdings eher für eine Schwäche der IDEs. Zugegeben, C++ ist für ein Programm schwieriger zu "verstehen" als Java, aber theoretisch ließen sich die Namespaces genau so schick organisieren. Eine IDE die automatischusing-Anweisungen in.cpp-Dateien á la Java erzeugt, sobald man einen Namen aus dem Namespace verwendet hätte schon was
... da würd' ich mir glatt noch abgewöhnen das std::immer dazu zu schreiben (werd ich echt nicht los - ich denke immer da fehlt dann was :D). Mitusingfange ich meist erst bei Bibliotheken wie Boost an (da muss man auch schon ziemlich verrückt sein, es da nicht zu tun).Finnegan
-
Thnx erstmal.
Eisflamme schrieb:
Darüber hinaus: Wir hatten letztens die Diskussion, ob man namespaces so einsetzen sollte, wie du es tust, und kamen zu dem Schluss, dass das wsl nicht so gut ist.
Ich musss mich dran halten, da eine Bibliothek.
Eisflamme schrieb:
Ein namespace "com" ergibt in meinen Augen absolut keinen Sinn in C++.
com::example war nur hier ein Beispiel.
Eisflamme schrieb:
..., denn du nutzt es meiner Ansicht nach nicht so, wie man es benutzen sollte.
Ich würde es gerne richtig machen. Wie würde man es denn dann benutzen?
ByTheWay: Löst das meine Fehlermeldungen immer noch nicht

-
tntnet schrieb:
Dein Forwarddeklaration sagt, dass es eine Klasse Ui::MyDialog gibt. Die verwendest Du dann auch. Offensichtlich hast Du sie aber nicht deklariert. Bei "new Ui::MyDialog" weiss der Compiler, dass es die Klasse gibt, aber nicht wie sie aussieht.
Das DialogFenster ist ja automatisch mit dem Designer erzeugt. Ich habe lediglich die 3 Zeilen using com::example::mydialogs und das using othernamepsaces hinzugefügt.
Ohne diese Zeilen ließ sich das ja bereits kompilieren, d.h. Ui:MyDialog müsste dann doch schon deklariert gewesen sein?
-
Finnegan:
Genau. namespaces nicht im Überdruss zu verwenden ist ja auch eine Reaktion darauf, dass IDEs damit nicht umgehen können. Es ist einfach nicht pragmatisch und meistens wohl auch nicht nötig.Bei RALFWICKUMs Code ging es mir aber um com::example::bla... Das ist ja nichts von QT bereitgestelltes. Bei QT würde ich mir sowieso wünschen, dass namespaces tatsächlich unterstützt würden. Da der moc-Compiler ja in die moc-Dateien keinen namespace einbaut, kann ich z.B. nicht zwei QT-Klassen "Range" in unterschiedlichen namespaces halten. Edit: Das habe ich noch nicht probiert, davon gehe ich jedoch aus.
Ich würde es gerne richtig machen. Wie würde man es denn dann benutzen?
Gar nicht, QT_NAMEPSACE_START und _END solltest du nur einsetzen, wenn du tatsächlich Kompatibilitätsprobleme erwartest, du verbesserst dein Design nicht, indem du es prophylaktisch einsetzt. Und wenn du es einsetzt, dann gehört es nur um forward-Deklarationen von Haus-Qt-Klassen usw., ich habe das ja verlinkt. Deine selbst erstellten Klassen oder die vom Designer sollten das eigentlich nicht nutzen, wenn ich da nicht auf dem Holzweg bin. Hier gibt es ja keine Konflikte, es gibt ja nur die eine Version deiner ui-Klasse.
In deinem Fall: QT_NAMESPACE_START/END löschen sollte eigentlich reichen. Wenn nicht, poste nochmal den aktualisierten Code.

-
Eisflamme schrieb:
Gar nicht, QT_NAMEPSACE_START und _END
QT_NAMEPSACE_START und _END befindet sich im ui_mydialog.h, ergo wird es durch QtDesigner erzeugt. dort möchte ich es sehr ungern manuell rauslöschen.
Mein wie benutze ich es richtig bezieht sich auf der Benutzung der eigentlichen namespace.s..
-
Dann war ich doch auf dem Holzwerg... vermutlich ist das bei dir auch einfach leer definiert.
Aber dann sieht der Code so ok aus.
Edit: Also wenn QT_NAMESPACE_START nichts macht, dann ist der Code ok. Ansonsten gibt es natürlich das Problem, dass es einmal Ui::MyDialog und einmal QT_NAMESPACE::Ui::MyDialog gibt.
Testweise (!) würde ich zunächst doch mal QT_NAMESPACE_START/END auskommentieren in der ui_[...].h. Korrekter wäre es auch QT_NAMESPACE_START/END um deine forward declaration in der Header-Datei zu schreiben. Sollte der QT-Namespace genutzt werden, muss das nämlich auch für die forward declaration geschehen.
-
Eisflamme schrieb:
Aber dann sieht der Code so ok aus.
Stop! Ja das stimmt. der Fehler lag an was ganz anderem, einem Fehlerhaften #include .
Ich musste mich auch an folgende Struktur halten, sodass ich eine falsche Header importiert hatte

#include "com/example/mydialogs/mydialog.h" löste mein Problem.Danke nochmals!