【问题标题】:Is it possible to reuse constructor?是否可以重用构造函数?
【发布时间】:2013-03-10 03:04:42
【问题描述】:

我有一个名为 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 in constructor B? 如果不是,这似乎太多余了,我相信有更好的方法来解决这种多余的问题。

【问题讨论】:

  • 你确定构造函数有足够的参数吗?或许加点?
  • 委托构造函数或默认参数。
  • 为什么不直接编写一个名为initialise 的私有函数并在构造函数中使用它?
  • @Rubby:考虑Named Parameter Idiom。和类似的想法。
  • @Rubby initialize 函数的问题是它实际上不能进行初始化,只能赋值。

标签: c++ qt class object constructor


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多