【问题标题】:How can I add a class member if the other class' constructor requires arguments?如果另一个类的构造函数需要参数,我如何添加一个类成员?
【发布时间】:2012-08-13 08:54:55
【问题描述】:

我在 C++ 中编写的代码不多,所以如果这是微不足道的,请原谅我。

我的“Foo”类看起来有点像这样:

class Foo {
    public: Foo(int n) { }
};

另一个类“Bar”现在应该有一个类型为“Foo”的类成员。

class Bar {
    private: Foo f;
};

这显然失败了,因为“Foo”没有不需要任何参数的构造函数。但是,Foo f(1); 之类的东西也会失败。

有什么办法可以解决这个问题吗?还是我应该在这里使用指针?

【问题讨论】:

    标签: c++


    【解决方案1】:
    class Bar {
    public:
        Bar():f(0) { }
        explicit Bar(int n):f(n) { }
        private: Foo f;
    };
    

    写你自己的c-tors,使用initializer-list,或者在Foo中写不带参数的c-tor,或者使用pointer,或者你可以写在C++11

    class Bar {
    public:
        private: Foo f = Foo(1);
    };
    

    【讨论】:

      【解决方案2】:

      这可以通过两种不同的方式处理。

      (1) 为class Foo提供适当的参数构造函数

      您可以引入无参数构造函数Foo() 或编辑当前接受默认参数的构造函数,即Foo(int n = 0)

      (2) 在Bar 内调用class Foo 的构造函数,并带有适当的参数

      例如

      class Bar {
      ...
        Bar() : f(0) {}  // (a) pass the argument explicitly 
        Bar(int n) : f(n) {} // (b) receive argument inside Bar()
      };
      

      【讨论】:

      • 一般来说,单参数构造函数应该使用explicit 来禁止意外的转换,例如在您的示例中从intBar。在这种情况下,我会使用explicit Bar(int n=0) : Foo(n) {}
      • @phresnel,我相信这是个案。有些人希望进行这些转换,有些人不想要它们。我会把它留给编码员。
      • Bar() : Foo(0)Bar() : f(0)有区别吗?
      • Foo 不是基类,因此您不能以这种方式调用它的构造函数。你必须说出你想初始化哪个成员。
      • @Niko:是的,有。 Foo(0) 调用基类 Foo 的 c-tor,所以这里是错误的。 f(0) 调用 f 类成员的 c-tor。
      【解决方案3】:

      你可能有一个 Foo 的默认构造函数,或者在 Bar 类中使用 Foo 的指针,然后再设置一个对象。

      【讨论】:

      • ... 或者写一个 Bar 构造函数来彻底构造一个 Foo,这应该是最优选的。
      【解决方案4】:

      我猜如果你的 Foo 需要一个参数来构造,有两种可能性:
      - 您的 Bar 将使用 静态数字 来构建自己的 Foo(所有 Bar 在 Foo 中都将具有相同的 n)
      - 您的酒吧的成员 Foo 中都会有不同的数字。然后,您可以将一个数字传递给 Bar 构造函数,如下所示:

      class Bar {
          Bar(int n) : Foo(n) { ... } ;
          }
      

      【讨论】:

      • 这对我来说没有意义。
      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多