Seite 1 von 1
QObject seit 4.5 invokable?
Verfasst: 12. November 2009 09:11
von Cartman
Ich versuche gerade, von QObject zu erben, aber der QObject-Konstruktor ist seit 4.5 mit dem Makro Q_INVOKABLE versehen. Von einer Klasse mit privatem Konstruktor kann ich ja nicht erben.
Dabei bin ich mir sicher, daß ich eine Ableitung schon mehrmals in der Vergangenheit gemacht habe. Laut Doku ist der Konstruktor in dieser Beziehung verändert (seit 4.5):
http://doc.trolltech.com/4.5/qobject.html
Was nun? Und vor allem, warum?
Verfasst: 12. November 2009 09:20
von RHBaum
???
aber der QObject-Konstruktor ist seit 4.5 mit dem Makro Q_INVOKABLE
was sich aber nur auf den CopyConstructor (Signatur QOBject::QObject(const QOBject & ) ) bezieht !!!
Den wolltest doch aber ned zum vererben nutzen oder ???
du kannst von jeder klasse erben, die Dir einen benutzbaren Construktor zur verfuegung stellt.
ist dies nicht der Standardconstruktor musst du den anderen Construktor expliziet in deiner
Initialisierungsliste aufrufen.
Ich bin mir sicher, das QObject nen Construktor mit der signatur QObject::QObject(QObject * parent) Dir zur verfuegung stellt, den musst halt nur nutzen ! (Siehe
http://de.wikipedia.org/wiki/Initialisierungsliste)
Schau dir doch mal die mitgelieferten Beispiele in der qt an ... ich schaetz mal , das da grob 60% wenn ned mehr, der da deklarierten Klassen von QOBject ableiten. Cheaten die alle oder was ?
Und vor allem, warum?
weil die instanzdaten nix anderes sind als verwaltungsdaten, die jedes QObject soweiso neu, bzw nen eigenen satz, braucht ... was was alle QObjecte verwenden, iss eh statisch bzw global.
Warum sollt man eine kopie von sowas brauchen ???
Ciao ...
Verfasst: 12. November 2009 09:25
von Cartman
Hallo,
Initialisierungslisten kenne ich und benutze ich ständig, auch zum Aufrufen eines Basiskonstruktors.
Mein Problem ist aber, daß Object nur einen einzigen Konstruktor hat, der zudem privat ist.
Q_INVOKABLE QObject ( QObject * parent = 0 )
Verfasst: 12. November 2009 09:32
von RHBaum
Noe, ich verwend die 4.5.0
und QObject::QObject(QObject * parent)
iss bei mir definitiv nicht private !!!
nutz ich taeglich ....
es ist Q_INVOKABLE, das macht es nicht private, sondern bewirkt eigentlich das es nen mechanismuss gibt, wo man QObjecte in den QT Mechanismen "weitergeben", quasi kopieren, aber eben nicht wirklich, ohne den Copy Construktor (andere Signatur) zu benutzen ....
der Constructor iss schon noch zugänglich (public in dem Fall) für dich !
Ciao ...
Verfasst: 12. November 2009 09:38
von Cartman
Code: Alles auswählen
class Schedule : public QObject
{
Q_OBJECT
public:
Schedule(QObject* parent = 0);
....
Code: Alles auswählen
Schedule::Schedule(QObject* parent)
: QObject(parent)
{
}
Bei sowas gibt es vom Compiler:
QObject::QObject: Kein Zugriff auf private Member
Würdest Du mir aber zustimmen, daß Q_INVOKABLE beim Konstruktor erst seit 4.5 drin ist?
Ich verwende 4.5.3 mit einem aktuellen msvc.
Verfasst: 12. November 2009 09:46
von RHBaum
Ich muesst nachschauen ....
Aber in der qt 4.5.0 iss es definitv drin ....
Aber trotzdem funktioniert sowas
Code: Alles auswählen
Schedule::Schedule(QObject* parent)
: QObject(parent)
{
}
klaglos bei mir ...
sicher das ned was anderes dir den fehler verursacht. Compilerfehlermeldungen sind manchmal ganz schoen ... aehm unpraezise ^^
Ciao ...
Verfasst: 12. November 2009 10:01
von Cartman
Ich habe ein Minimalprogramm erzeugt, das ohne Mucken kompiliert. Den Fehler im ursprünlichen Code sehe ich noch nicht, vor allem da ich das Minimalprogramm von den Vererbungsangaben und vom Konstruktor her nicht anders gemacht habe...
Ich schließe mal der Reihe nach alles aus und suche das Problem.
Verfasst: 12. November 2009 10:07
von NoRulez
Welche Header hast Du bei Deinem Beispiel inkludiert?
LG NoRulez
Verfasst: 12. November 2009 10:14
von Cartman
Diese hier:
Code: Alles auswählen
#include <QObject>
#include <QString>
#include <QMap>
#include <QList>
#include <QVariant>
Wenn ich Copy-Ctor und Zuw.-Operator hinzufüge, kompiliert es:
Code: Alles auswählen
Schedule(const Schedule&) {}
Schedule& operator=(const Schedule&) { return *this; }
Ich kam auf diesen Versuch wegen der weiteren Compilermeldung neben "QObject::QObject is private":
Code: Alles auswählen
Object.h(115): Siehe Deklaration von 'QObject'
Diese Diagnose trat in der vom Compiler generierten Funktion "Schedule & Schedule::operator =(const Schedule &)" auf.
Schedule.cpp
Dabei will ich gar kein eigendefiniertes Copy-Zeugs. Die einzigen Member sind eine QList, ein int und ein bool.
Verfasst: 12. November 2009 10:50
von Christian81
Also doch der Copy ctor... Du versuchst nicht etwa ein QObject in eine QMap oder QList als Instanz zu speichern??
Verfasst: 12. November 2009 11:08
von Cartman
Ja, ich habe tatsächlich eine QList, in der sich das Object befindet. Durch das nachträgliche Umwandeln der Klasse in ein QObject bin ich wohl zu diesem Problem gekommen. Muß ich halt eine Pointer-Liste zur Verwaltung verwenden. Danke für die Hinweise!