0

コンストラクターに渡される特定のポインターが ではないことを確認する必要がありNULLます。通常Q_ASSERT()、次のように関数の先頭に a を置きます。

void Class::doStuff( Object *object )
{
    Q_ASSERT( object );
    // do stuff
}

しかし、コンストラクターは特別な関数であるため、これと同じ手法が適切かどうかを知りたいです。このようなコンストラクタで Q_ASSERT を使用すると何か問題がありますか?

Class::Class( Object *object, QObject *parent = NULL ) 
    :
QObject( parent ),
_object( object )
{
    // make sure that object is not NULL
    Q_ASSERT( object );

    // do stuff that will dereference the pointer, hence it must not be NULL
    if( object->hasSomething() )
        // do stuff
}

これが悪い習慣である場合NULL、理想的には建設時にチェックする正しい方法は何ですか?

4

2 に答える 2

3

コンストラクタでの使用Q_ASSERTはOKです。そうでない理由はありません。出力にメッセージを出力するだけです。

于 2013-06-14T17:12:19.883 に答える
0

これは、コードがどこでどのように使用されるかによって大きく異なります。コンストラクターは特別な関数であり、ベストプラクティスは正しいです

  1. その中で最小限の外部関数と呼び出し(コードベースの外部)として使用し、
  2. 例外をスローする可能性のある呼び出しは使用しないでください。これは、例外がスローされると、アプリを終了して適切な catch 呼び出しを呼び出す前に、スタックの巻き戻しが発生してクリーンアップされるためです。

それがコンストラクター内にある場合、その特定のオブジェクトの状態は、何が行われ、何がクリーンアップが必要かなどに関して明確ではありません。したがって、結局のところ、それがあなたのケースの問題であるかどうかを確認するのはあなたの電話です.

于 2014-04-29T18:57:50.410 に答える