Seite 1 von 1

QSize überladen bringt Fehler

Verfasst: 16. September 2007 22:22
von pospiech
Ich bekomme folgende Fehler
1>.\moc_QSize3d.cpp(37) : error C2039: 'staticMetaObject': Ist kein Element von 'QSize'
1> c:\programme\qt4\include\qt\../../src/corelib/tools/qsize.h(34): Siehe Deklaration von 'QSize'
1>.\moc_QSize3d.cpp(51) : error C2039: 'qt_metacast': Ist kein Element von 'QSize'
1> c:\programme\qt4\include\qt\../../src/corelib/tools/qsize.h(34): Siehe Deklaration von 'QSize'
1>.\moc_QSize3d.cpp(56) : error C2039: 'qt_metacall': Ist kein Element von 'QSize'
1> c:\programme\qt4\include\qt\../../src/corelib/tools/qsize.h(34): Siehe Deklaration von 'QSize'
1>QSize3d.cpp
1>.\QSize3d.cpp(5) : error C2664: 'QSize::QSize(const QSize &)': Konvertierung des Parameters 1 von 'QObject *' in 'const QSize &' nicht möglich
1> Ursache: Konvertierung von 'QObject *' in 'const QSize' nicht möglich
1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
wenn ich mit folgendem code versuche QSize durch Überladen um eine dritte Dimension zu erweitern

Code: Alles auswählen

#ifndef QSIZE3D_H_
#define QSIZE3D_H_

#include <Qt/qobject.h>
#include <Qt/QSize.h>

class QSize3d : public QSize
{
	Q_OBJECT
public:
	QSize3d(QObject* parent = 0);
	virtual ~QSize3d();

	void setDepth ( int depth );
	int depth ();
private:
	int m_depth;
};
#endif

Code: Alles auswählen

#include "QSize3d.h"


QSize3d::QSize3d(QObject* parent /*= 0*/) : QSize(parent)
{
}


QSize3d::~QSize3d()
{
}

void QSize3d::setDepth ( int depth )
{
	m_depth = depth;
}

int QSize3d::depth ()
{
	return m_depth;
}
Bin für Ideen zur Fehlerbehebung dankbar.

Matthias

Verfasst: 17. September 2007 07:52
von Christian81
QSize ist kein QObject - warum also Q_OBJECT?

Verfasst: 17. September 2007 13:33
von phil collins
Der Fehler besteht darin, dass du in der initializer-list den constructor von QSize mit "QObject* parent" als Parameter aufrufst. QSize hat aber keinen solchen constructor. Du wolltest warscheinlich schreiben...

Code: Alles auswählen

QSize3d::QSize3d(QObject* parent /*= 0*/) : QObject(parent)
{
} 
...was völlig korrekt wäre.

Verfasst: 17. September 2007 13:39
von Christian81
phil collins hat geschrieben:Du wolltest warscheinlich schreiben...

Code: Alles auswählen

QSize3d::QSize3d(QObject* parent /*= 0*/) : QObject(parent)
{
} 
...was völlig korrekt wäre.
Ich würde sagen wir schauen uns nochmal genau den Header an...

Verfasst: 17. September 2007 13:49
von phil collins
OK, das stimmts natürlich - korrekt, wenn der header lauten würde:

Code: Alles auswählen

class QSize3d : public QSize, public QObject
{
   ...
};

Verfasst: 17. September 2007 13:59
von Christian81
Und selbst das ist noch nicht ganz korrekt wenn man Q_OBJECT verwenden will.
So sollte es sein:

Code: Alles auswählen

class QSize3d : public QSize, public QObject {
  Q_OBJECT
  ...
};

Verfasst: 17. September 2007 14:28
von phil collins
Christian81 hat geschrieben:Und selbst das ist noch nicht ganz korrekt wenn man Q_OBJECT verwenden will.
So sollte es sein:

Code: Alles auswählen

class QSize3d : public QSize, public QObject {
  Q_OBJECT
  ...
};
Lieber Herr Christian81 - wenn du mal bitte zum Anfang des Threads schauen würdest, was steht da schon? Das gute alte Q_OBJECT - Macro.
Wenn es dir nur darum geht, uns allen zu zeigen, dass du mehr drauf hast, als deine Postings vermuten lassen, dann gib doch zur Abwechslung auf simple Fragen einfach mal simple Antworten anstelle von Gegenfragen à la
QSize ist kein QObject - warum also Q_OBJECT?
Glaubst du im Ernst, dass der Code funktioniert, wenn man einfach das Q_OBJECT - Macro wegllässt? Dann schau dir den Quelltext lieber noch einmal genauer an und geh Trolle füttern!

Verfasst: 17. September 2007 14:42
von Christian81
Nun mach mal langsam und fang nicht gleich an hier rumzuheulen nur weil Du die Doku nicht lesen kannst.
Qt-Doku hat geschrieben: Multiple Inheritance Requires QObject to Be First

If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

// correct
class SomeClass : public QObject, public OtherClass
{
...
};
Wenn es dir nur darum geht, uns allen zu zeigen, dass du mehr drauf hast, als deine Postings vermuten lassen, dann gib doch zur Abwechslung auf simple Fragen einfach mal simple Antworten anstelle von Gegenfragen à la
Meine Postings geben so gut wie nie Antworten sondern versuchen dem Poster zum Nachdenken anzuregen. Wir sind ja hier nicht im Kindergarten wo man jeden alles vorkauen muss.
-->
Meine Frage nach dem QObject war so gemeint dass pospiech überlegen sollte warum er unbedingt ein QObject-Parent mit übergeben will. Das war sicher nur ein Missverständnis weil sonst alle von QObject abgeleiteten Klassen den Parent übergeben.

Des weiteren muss ich hier im Forum wohl niemanden zeigen was ich drauf habe...

Verfasst: 17. September 2007 15:33
von RHBaum
wenn wer die tiefen die der QT sourcen wird feststellen, das QSize keinen im source definierten destructor hat. (der compiler generiert einen, und den sicherlich nicht virtual)

Ausserdem mit Q_DECLARE_TYPEINFO - Q_MOVABLE_TYPE
"specifies that Type has a constructor and/or a destructor but can be moved in memory using memcpy()."

definiert ist, was darauf hindeutet, das das ding keine vtable hat !

Ergo - ableiten von QSize nicht vorgesehen - designtechnisch sehr kritisch zu betrachten.

Statt Inheritance mal Aggregation in Betracht ziehen !

Zitat aus nem schlauen C++ Buch:
"Nutze Vererbung nie um wiederzuverwenden, sondern nur um wiederverwendet zu werden !"

Der naechste Punkt:
Ist denn ein 3D punkt auch gleichzeitig ein 2 D Punkt ? Nach meiner Auffassung her eher nicht.

Dies alles sollte einem eigentlich davon abbringen, da mit Vererbung drauf zu schiessen.

Ich wuerde fuer meine 3D darstellung eigene Punkt-klassen und andere definieren. Und fuer "gewollte" konvertierungen Convertierungs-Ctors und Convertierungs Operatoren verwenden. Wobei das auf grund der logic her schon nicht ganz trivial ausfallen sollte ....
Im zweifelsfall transformationen nutzen um 3D Objecte auf 2 D runterzubrechen, und keine implizieten Umwandlungen nutzen ! (das spart sicher spaeter viel viel Aerger! )

Ciao ...

Verfasst: 17. September 2007 17:51
von pospiech
Ich habe jetzt mal herausgelesen, das QSize kein Q_Object benötigt (das mir der Assistent, und nicht ich, eingebaut hat) und das es eher unsinnig ist überhaupt von QSize abzuleiten - was ich natürlich auch sein lassen kann.

Matthias

Verfasst: 17. September 2007 18:06
von RHBaum
Ja genau :-)
Ableiten hat nich nur vorteile.

und grad bei kleineren Klassen, also die kaum komplizierte Abhaengigkeiten haben, wenige eigene Daten ... also quasi einem POD (plain old data) sehr nahe kommen, sollt man kleine knackige klassen verwenden, ohne ableitung.

Viele in C++ noch recht unerfahrene nutzen Vererbung eh viel zu intensiv, vor allem an stellen wo sie mehr aerger bekommen als nutzen.
Aber nen gefuehl dafuer bekommt man mit der Zeit.

Ciao ...