2016-03-21 36 views
0

Ich habe ein Problem, meinen Code zu debuggen. In einigen Qt Slot kann ich das:Segfault bei der Rückgabe des privaten Mitglieds

UIElementInterface* interface = qobject_cast <UIElementInterface*>(sender()); 

und die folgende Zeile gibt mir einen Segmentierungsfehler:

QStringList data = interface->getSetDefData(); 

dies nicht

QString hello = interface->getHello(); 

Die Implementierung von getSetDefData() innerhalb von UIElementInterface :

class UIElementInterface 
{ 
public: 
    ... 
    UIElementInterface(const QStringList& data) : m_setDefData(data) 
    { 
     std::cout << qPrintable(m_setDefData[0]) << std::endl; //everything as expected here.. 
    } 

    QStringList getSetDefData(){return m_setDefData;} //gives seg fault 
    QString getHello(){return QString("Hello");} //works fine 

private: 
    QStringList m_setDefData; 
}; 

würde ich jede mögliche Hilfe auf diesem schätzen :)

EDIT Basierend auf den Kommentaren i qobject_cast verwendet zu werfen einen CheckBox, die den Sender auf jeden Fall (im Falle des Absturzes) ist, und es ist ein Unterklasse QCheckBox. Also es ist definitiv ihnerits QObject (ich habe auch die Implementierung überprüft). Wenn ich den Rückgabewert wie vorgeschlagen überprüfe, ist es 0.

CheckBox* b = qobject_cast<CheckBox*>(sender()); 
if (b == 0) 
{ 
    std::cout << "Here we are" << std::endl; 
} 

so ist das das Problem. Ich muss noch herausfinden, warum das so ist, aber das verursacht wahrscheinlich den Absturz.

ANOTHER EDIT Druck aus dem Klassennamen sender()->metaObject()->className() die Wurzel des Übels ausgesetzt:

QSignalMapper

Fall :) geschlossen

+4

Klassische Crash-Fall, wenn 'dieses == NULL', eine NULL (oder ungültig) Zeigerobjekt:' getSetDefData() '' Dereferenzierungen this', die 'getHello()' nicht der Fall ist. – Dummy00001

+1

Die [Dokumentation für 'qobject_cast'] (http://doc.qt.io/qt-4.8/qobject.html#qobject_cast) sagt eindeutig, dass sie' 0' zurückgeben kann, was dasselbe wie ein Null-Zeiger ist, etwas, das Sie offensichtlich haben nicht überprüfen. –

+0

Wenn also die Implementierung für 'getSetDefData()' in einer Klasse wäre, die 'QObject' erbt, würde das nicht passieren? – tobilocker

Antwort

0

Es ist klar, aus der UIElementInterface Klassendeklaration, dass die Klasse nicht a QObject. Qt-Dokumentation auf qobject_cast Funktion lautet:

Die Klasse T erben muss (direkt oder indirekt) QObject und seine mit dem Q_OBJECT Makro erklärt.

So können Sie qobject_cast mit UIElementInterface Klasse nicht verwenden.

+0

Ja war da. Siehe Aktualisierung :) – tobilocker

Verwandte Themen