1

我有一个名为 FaultsTablemanager 的类,它有两个构造函数:

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);
...
}

我想在第二个构造函数中重用第一个构造函数,如下所示:

    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将不会被初始化(以后不能使用)。
所以我认为第一个构造函数的调用不会对对象进行操作,只会新建另一个未存储在我的构造函数中的对象。
但是我在子类中看到了 base calss 的构造函数的调用,它在同一个对象上运行,这就是我使用这种方法的原因。
那么我可以重用constructor Ainconstructor B吗?如果不是,它似乎太多余了,我相信有更好的方法来解决这种冗余。

4

1 回答 1

1

这只能在 C++11 中实现,即便如此,许多编译器还没有实现该特定功能。(GCC 刚刚从 4.7 开始支持它,但我没有亲自测试过)。该功能称为“构造函数委托”或“委托构造函数”。

据我所知, Visual Studio 20112012还不支持它。

您必须使用 Initialize() 函数(可能是私有的)来初始化两个构造函数的公共部分。

请参阅此处了解 GCC 对 C++11 功能的支持状态。(GCC 最高 4.8,MinGW 现在最高 4.7,所以最新的 MinGW 也有这个功能)。

于 2013-03-10T14:33:16.883 回答