2017-05-15 4 views
0

Ich versuche, von QObject * zu einem benutzerdefinierten Klassentyp zu konvertieren, aber der Zeiger, der diese Besetzung erhalten soll, ist immer NULL.qobject_cast gibt null zurück

Die entsprechenden Codezeilen:

Dies ist die Funktion mit dem gegossenen

void CFCInterface::fnAddConn() 
{ 

CFCConnections* f_pConn ; 
f_pConn= new CFCConnections(this); 


QObject* f_pObject = this; 

while(f_pObject) 
{ 
    f_pConn = qobject_cast<CFCConnections*>(f_pObject); 
    if(f_pConn) 
    break; 

    f_pObject = f_pObject->parent(); 

} 
if(f_pConn == 0) 
return; 

}

Diese im Haupt Konstruktor FCInterface genannt:

`CFCInterface::CFCInterface(QObject* parent): CInterface(parent), CFCAbstract() 
{ 
    //Some other functions being called 
    fnAddConn(); 

} 

CFCInterface::~CFCInterface() 
{ 

} 
` 

f_pConn bleibt NULL. Wenn irgendjemand raten könnte, warum das so ist, werde ich etwas zu folgen haben.

Als Referenz werde ich die Klasse und Header-Datei hinzufügen. Sie haben keine andere Funktion, als diesen Cast zu arbeiten.

Rubrik:

#include headers 

class CFCConnections: public CResourceItem 
{ 

    Q_OBJECT 

public: 
    CFCConnections(QObject*); 
    ~CFCConnections(); 



}; 


#endif 

Klasse:

#include headers 

CFCConnections::CFCConnections(QObject* parent) : CResourceItem(parent) 
{ 

    //Empty contructor 


} 
CFCConnections::~CFCConnections() 
{ 

} 

PS: Ich glaube nicht, was der Code versucht, relevant zu tun hier, aber falls jemand FCInterface wundert ist die Mutter Klasse zu FCConnections. Ich versuche, eine Baummodellliste zu implementieren, in der jedes Element seine eigene Klasse und Funktionalität hat. Ich verwende die Besetzung, um "Verbindungen" unter FCInterface erscheinen zu lassen.

+0

einen Haltepunkt hinzufügen in „QObject * f_pObject = diesem,“, dann prüfen, was das eigentlich zeigt, und mit dem Debugger durch folgen, bis Sie auf die Besetzung bekommen. – ManuelH

+0

@ManuelH Ich habe gerade das gemacht. 'f_pConn' wird als Nullzeiger initialisiert. In der Zeile, nach der Sie gefragt haben, erhält 'f_pObject' die Adresse von _this_. Danach schlägt der 'qobject_cast' fehl und' f_pConn' bleibt als Nullzeiger übrig. 'f_pObject' ruft die Adresse des Elterns ab und die Schleife wird neu gestartet. Die dem 'f_pObject' am Ende zugewiesene Adresse ändert sich mit jeder Schleife und die Schleife wird beendet, wenn' f_pObject' zu einem Nullzeiger wird. Ich bekomme nichts von diesem Verhalten –

Antwort

0

Es ist wirklich einfach: das Objekt, das Sie diese Aktion ausführen, ist kein Nachkomme von CFConnections.

Sie müssen in der Lage sein, mit Ihrem Finger auf QObject Konstruktoraufrufe und/oder setParent Aufrufe zu verweisen, die ausgeführt werden, um eine solche Parent-Child-Beziehung herzustellen.

Ihr Codebeispiel ist nicht vollständig und Sie haben viele irrelevante Details. Stellen Sie eine einzelne Datei Beispiel, das das Problem zeigt.

+0

Vielen Dank für die Antwort. 1. Ich gebe zu, die Klassendatei war unnötig, aber ich weiß nicht, wie ich das Problem in einer Datei erklären könnte. Dieser Code ist meiner Meinung nach vollständig, deshalb bin ich von diesem Problem verwirrt. 2. Das Makro Q_OBJECT in der Header-Datei sollte darauf achten, die Eltern-Kind-Beziehung richtig einzurichten? –

+0

Denken Sie daran, wie C++ funktioniert.Jeder Code in mehreren Dateien kann in einer Datei zusammengefasst werden. Das 'Q_OBJECT' Makro erstellt keine Art von Eltern-Kind-Beziehung. Ich habe Ihnen gesagt, was Sie brauchen, um es zu etablieren: Nehmen Sie Ihren Finger wörtlich und zeigen Sie auf Konstruktoren, an die Sie den Parent-Zeiger übergeben, oder auf 'setParent'-Aufrufe, an die Sie den Parent-Zeiger ebenfalls übergeben. Wenn Sie es nicht tun können, wird es nicht funktionieren. Es ist wirklich so einfach. Nichts dran. Zeigen Sie mit dem Finger auf den Code. Wenn Code nicht existiert, schreibe ihn. –

0

MÖGLICHE LÖSUNG:

Schaltet den Fehler in der ersten Zeile war aus. Ich schrieb CFCConnections* f_pConn = 0 und dachte, dass dies die passende Speicherzuweisung für mich tun würde. ändern, dass die folgenden regelte das Problem:

CFCConnections* f_pConn; 
f_pConn = new CFCConnections(this); 
+0

Das ergibt keinen Sinn. Alles, was Sie hier getan haben, ist Speicherverlust, wenn Ihre Besetzung erfolgreich ist. Vielleicht gibt es, wie in obigem Beispiel, einfach nicht genug Code, um jemandem den Kontext dessen zu geben, was Sie wirklich tun wollen. –

+0

@RetiredNinja was ist, wenn ich den Zeiger am Ende löschen? Und ich verstehe wirklich nicht, was mein Code fehlt? Es ist eine Frage bezüglich der Anwendung von 'qobject_cast', können Sie mir bitte sagen, welcher Kontext hier helfen würde? –

+0

Sie haben ungefähr ein Dutzend Zeilen Code angezeigt, vermutlich von einer Funktion, aber wir wissen nicht, wie die Funktion benannt ist, welche Parameter sie benötigt oder wie sie aufgerufen wird. Wenn Sie mit Ihrer Lösung zufrieden sind, können Sie einfach weitermachen, aber mein Bauchgefühl sagt, dass es nicht stimmt, und basierend auf dem, was Sie geteilt haben, kann Ihnen niemand sagen, was richtig ist. Es gibt einen Grund, warum wir ein vollständiges Beispiel und nicht nur Schnipsel verlangen. –