【问题标题】:Overloading Default Construction with Initializer List使用初始化列表重载默认构造
【发布时间】:2010-12-20 02:20:51
【问题描述】:

我需要知道如何让某些东西发挥作用。我有一个带有构造函数的类和一些在初始化列表中初始化的常量。我想要的是能够创建一个不同的构造函数,它需要一些额外的参数,但仍然使用初始化列表。像这样:

class TestClass
{
    const int cVal;
    int newX;
    TestClass(int x) : cVal(10)
    { newX = x + 1; }
    TestClass(int i, int j) : TestClass(i)
    { newX += j; }
}

非常糟糕的例子,但它抓住了重点。问题是,我该如何让它发挥作用?

【问题讨论】:

    标签: c++ initialization overloading default-constructor


    【解决方案1】:

    一个构造函数无法委托给同一类的另一个构造函数。您可以将公共代码重构为静态成员函数,但后者无法初始化字段,因此您必须在每个构造函数中重复字段初始化程序。如果特定的字段初始值设定项具有计算值的复杂表达式,您可以将其重构为静态成员函数,以便在所有构造函数中重用。

    这是一个已知的不便,在 C++0x 中将提供一种委托给另一个构造函数的方法。

    【讨论】:

      【解决方案2】:

      你不能在 C++03 中这样做,你必须重新输入初始化列表。这将在 C++0x 中修复。巧合的是,语法正是您所拥有的,更巧合的是,example on Wikipedia 几乎就是您的代码。 :)

      【讨论】:

        【解决方案3】:

        使用C++11的委托构造函数(在初始化列表位置调用),如下:

        SensorObjData::SensorObjData() noexcept : sensor_type_{PerceptionTypes::SensorType::UNKNOWN}, sensor_id_{0U},
                                                    is_dirty_{false}, cipv_{0U}, num_obstacles_{0U}, num_lane_markers_{0U},
                                                    num_traffic_signs_{0U}, num_traffic_lights_{0U},
                                                    num_free_space_border_points_{0U}, num_trans_points_{0U},
                                                    timestamp_{0}/*, detection_ready_{false}, segmentation_ready_{false}*/
            {
                data_buf_ptr_ = std::make_shared<std::array<char, kMaxDataLength>>();
            }
        
            SensorObjData::SensorObjData(std::int64_t timestamp) noexcept : SensorObjData()
            {
                timestamp_ = timestamp;
            }
        

        总结一下: 1. 委托构造时,初始化列表只能有类本身的构造器 2. 委托构造器的函数体代码(如果有的话)会在委托构造器体运行之前运行。

        【讨论】:

          猜你喜欢
          • 2015-07-10
          • 2017-05-31
          • 2012-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-17
          • 1970-01-01
          • 2012-09-15
          相关资源
          最近更新 更多