1

FaultsTablemanager という名前のクラスが 1 つあり、2 つのコンストラクターがあります。

class FaultsTableManager : public QObject
{
    Q_OBJECT
public:
    FaultsTableManager(MainWindow* mainW,
                       QMutex* mu,
                       QWidget* parentPa,
                       QTableWidget* tabA,
                       QRadioButton* sel1,
                       QRadioButton* sel2,
                       QQueue<RDIU*>* que,
                       QTableWidget* tabDe,
                       QWidget* parentDe,
                       QLabel* nameLab,
                       QLabel* timeLab);

    FaultsTableManager(MainWindow* mainW,
                       QMutex* mu,
                       QWidget* parentPage1,
                       QTableWidget* tabA,
                       QRadioButton* sel1,
                       QRadioButton* sel2,
                       QList<RDIU*>* list1,
                       QList<RDIU*>* list2,
                       QTableWidget* tabDe,
                       QWidget* parentDe,
                       QLabel* nameLab,
                       QLabel* timeLab);
...
}

次のように、最初のコンストラクターを2番目のコンストラクターで再利用したい:

    FaultsTableManager::FaultsTableManager(MainWindow* mainW,
                                           QMutex* mu,
                                           QWidget* parentPa,
                                           QTableWidget *tabA,
                                           QRadioButton *sel1,
                                           QRadioButton *sel2,
                                           QList<RDIU*> *list1,
                                           QList<RDIU*> *list2,
                                           QTableWidget* tabDe,
                                           QWidget* parentDe,
                                           QLabel* nameLab,
                                           QLabel* timeLab)
    {
        FaultsTableManager(mainW,
                           mu,
                           parentPa,
                           tabA,
                           sel1,
                           sel2,
                           NULL,
                           tabDe,
                           parentDe,
                           nameLab,
                           timeLab);
//        table = tabA;
        queue = NULL;
        list = list1;
        errList = list2;
    }

しかし、コード行をtable = tabA;コメントのままにしておくと、メンバーtableは初期化されません (後で使用できません)。
したがって、最初のコンストラクターの呼び出しはオブジェクトでは機能せず、コンストラクター関数に格納されていない新しい別のオブジェクトのみが機能すると思います。
しかし、サブクラスのベース カルスのコンストラクターの呼び出しを見たことがあります。これは、このメソッドを使用する理由である同じオブジェクトで動作します。で再利用する
ことは可能ですか?constructor Aconstructor Bそうでない場合は、冗長すぎるように思われ、この冗長性を解決するためのより良い方法があると思います。

4

1 に答える 1

1

これは C++11 でのみ可能であり、その場合でも、多くのコンパイラにはその特定の機能がまだ実装されていません。(GCC は最近 4.7 でサポートしましたが、個人的にはテストしていません)。この機能は、「コンストラクターの委任」または「コンストラクターの委任」と呼ばれます

私の知る限り、Visual Studio 2011および2012はまだサポートしていません。

両方のコンストラクターの共通部分を初期化するには、Initialize() 関数 (おそらくプライベート) を使用する必要があります。

C++11 機能の GCC サポート状況については、こちらを参照してください。(GCC は 4.8 まで、MinGW は現在 4.7 までなので、最新の MinGW にもこの機能があります)。

于 2013-03-10T14:33:16.883 に答える