0

次のインストラクターを考えてみましょう。とにかく、treeItem と status を初期化する必要がありましたが、オーバーロードされた関数では、id 変数も導入できます。

しかし、ばかげているように見えます。両方の関数でこれを行うべきではありません。何か提案はありますか?

Contact ()
{
    treeItem = NULL;
    status = offline;
}

Contact (const QString & id)
{
    treeItem = NULL;
    status = offline;

    this->id = id;
}
4

3 に答える 3

2

ctor-initializer-list の恩恵を受けることができますが、C++11 にアップグレードするまでは、コンストラクターごとに変数の初期化を複製する必要があります。

1 つのオプションは、次のように、既定の引数を使用してコンストラクターの数を減らすことです。

Contact (const QString& identifier = QString())
    : treeItem(NULL), status(offline), id(identifier)
{
}
于 2012-05-05T03:55:30.203 に答える
1

デフォルトの引数を使用して、2 つのコンストラクターを明示的に定義しないようにします。そして、初期化子リストを使用します。そのようです:

Contact (const QString & id = QString())
    : treeItem(NULL)
    , status(offline)
    , id(id) // yes this works but you may wish to change the parameter name)
{}

または、委譲コンストラクターを使用した C++11 の場合::

Contact ()
    : treeItem(NULL)
    , status(offline)
{}

Contact (const QString & id = QString())
    : Contact()
    , id(id)
{}
于 2012-05-05T03:58:21.290 に答える
0

(デフォルト値を指定するのではなく) 本当にコンストラクターをオーバーロードしたい場合は、共通コードを独自の関数に移動し、各コンストラクターから呼び出すのが最善の方法です。

Contact()
{
    init();
}

Contact(const QString &id)
{
    init();
    this->id = id;
}

private void init() {
    treeItem = NULL;
    status = offline;
}
于 2012-05-05T03:58:14.210 に答える