2016-03-21 3 views
0

私のコードのデバッグに問題があります。いくつかのQtのスロットに私はこれを実行します。プライベートメンバーを返すときのSegfault

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

を、次の行は私にセグメンテーションフォールトを与える:

QStringList data = interface->getSetDefData(); 

UIElementInterfaceの内部getSetDefData()のこの行いません

QString hello = interface->getHello(); 

実装:

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; 
}; 
私は間違いなく(クラッシュの場合)、送信者であり、それはaは CheckBoxにキャストする qobject_castを使用したコメントに基づいて

私はこの1つ上の任意の助けをいただければ幸いです:)

EDIT サブクラスQCheckBox。だから間違いなく私はQObjectをihnerits(私はまた、実装をダブルチェック)。私が戻り値を確認すると、それは0であることが判明しました。

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

このように問題があります。私はまだこれがなぜであるか把握する必要がありますが、これはおそらくクラッシュを引き起こします。クラス名sender()->metaObject()->className()アウト

ANOTHER EDIT印刷が悪の根源を暴露:

QSignalMapper

ケースは、それはクラスではないことUIElementInterfaceクラス宣言から明らかです:)

+4

'this == NULL'、NULL(または無効な)ポインタオブジェクトのクラッシュの古典的なケース:' getSetDefData() 'は' this'を参照し、 'getHello()'はそうではありません。 – Dummy00001

+1

[qobject_cast'のドキュメント](http://doc.qt.io/qt-4.8/qobject.html#qobject_cast)は、明らかにヌルポインタと同じ「0」を返すと言っています。チェックしないでください。 –

+0

したがって、 'getSetDefData()'の実装が 'QObject'を継承するクラス内にあれば、これは起こりませんか? – tobilocker

答えて

0

閉じQObject。クラスTは、(直接的または間接的に)はQObjectを継承しQ_OBJECTマクロで宣言されなければならない

qobject_cast関数でQtのドキュメントは、と述べています。

qobject_castUIElementInterfaceクラスを使用することはできません。

+0

はい、そこにいました。アップデートを参照してください:) – tobilocker

関連する問題