是否可以重用构造函数?

时间:2013-03-10 03:04:42

标签: c++ qt class object constructor

我有一个名为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 A中重用constructor B吗? 如果没有,它似乎太多余了我相信有更好的方法解决这种冗余问题。

1 个答案:

答案 0 :(得分:1)

这只适用于C ++ 11,即便如此,许多编译器还没有实现该特定功能。 (GCC最近刚刚支持4.7,但我没有亲自测试过)。该功能称为“构造函数委派”或“delegating constructors”。

据我所知,

Visual Studio 20112012尚不支持它。

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

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