QObject seit 4.5 invokable?

Alles rund um die Programmierung mit Qt
Antworten
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

QObject seit 4.5 invokable?

Beitrag 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?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Zuletzt geändert von RHBaum am 12. November 2009 09:26, insgesamt 1-mal geändert.
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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 )
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Welche Header hast Du bei Deinem Beispiel inkludiert?

LG NoRulez
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Also doch der Copy ctor... Du versuchst nicht etwa ein QObject in eine QMap oder QList als Instanz zu speichern??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Cartman
Beiträge: 55
Registriert: 31. März 2006 16:55

Beitrag 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!
Antworten