【问题标题】:How To Specify Which Constructor Gets Called for a Member Field Object?如何指定为成员字段对象调用哪个构造函数?
【发布时间】:2013-02-18 19:11:07
【问题描述】:

如果我有一些类,并且在该类中我有一个我编写的自定义队列对象,我的类定义如下所示:

class Parser
{
    public:
        Parser();
    private:
        Queue<char> Q;
};

class Queue 有一个默认构造函数以及一个接受单个 int 参数来指定其容量的构造函数,我如何告诉 Parser 类在实例化 Q 字段时应该触发接受参数的构造函数(所以它可以有更大的容量)而不是触发默认构造函数(它的容量很小)?我已经查过了,但我很难找到不围绕继承和父类构造函数的答案。谢谢!

另外,我尝试将Queue&lt;char&gt; Q 替换为Queue&lt;char&gt; Q(100),但编译器对此抱怨。

【问题讨论】:

  • 抱怨的不是 QT,而是你的编译器

标签: c++ constructor


【解决方案1】:

在 Parser 的构造函数实现中使用初始化列表...

Parser::Parser()
:Q(10) ///example of initializing to capacity 10
{
}

【讨论】:

    【解决方案2】:

    像这样:

    Parser() : Q(100) { }
    

    【讨论】:

      【解决方案3】:

      它在你选择构造函数的成员初始化列表中:

      • 如果要调用默认构造函数,请执行以下操作:

        Parser() : Q() {} //calls the default constructor
        

        由于你没有传递任何参数,那么上面的内容就是:

         Parser() {} //Q is also constructed invoking the default constructor
        

        在进入Parser构造函数体之前,Q完全调用默认构造函数构造的。

      • 如果要调用其他构造函数,请执行以下操作:

        Parser() : Q(10) {} //calls the other constructor
        

        这就是你想要的。在这种情况下,您通常希望将大小传递给Parser,然后它会这样做:

        Parser(int size) : Q(size) {} //calls the other constructor
        

      在 C++11 中,您可以在声明本身中这样做:

      class Parser
      {
           //...
           Queue<char> Q(10); //C++11 only
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        相关资源
        最近更新 更多