【问题标题】:How do you use the non-default constructor for a member?如何为成员使用非默认构造函数?
【发布时间】:2011-01-06 12:47:02
【问题描述】:

我有两门课

class a {
    public:
        a(int i);
};

class b {
    public:
        b(); //Gives me an error here, because it tries to find constructor a::a()
        a aInstance;
}

我怎样才能得到它,以便 aInstancea(int i) 实例化,而不是尝试搜索默认构造函数?基本上,我想从b的构造函数中控制a的构造函数的调用。

【问题讨论】:

  • 我意识到这是一个示例,而不是实际代码,但只是为了 ~~ 作为一个书呆子~~ 代码质量,一般来说,创建字段 public 不是一个好主意。当然,有一些用例,而且它普遍不好,但在这样做之前,请确保除了“它可能会简化我的一些代码”(“它确实简化了我的很多代码”是一个完全可以接受的理由)

标签: c++ class constructor default member


【解决方案1】:

您需要在构造函数初始化列表中显式调用 a(int):

b() : aInstance(3) {} 

其中 3 是您要使用的初始值。虽然它可以是任何 int。有关订单和其他注意事项的重要说明,请参阅 cmets。

【讨论】:

  • 非常感谢。我以为那只是为了调用父类构造函数。
  • 是的,你也可以用它来初始化成员。
  • 在某些情况下,您必须初始化成员(例如引用),您就是这样做的。
  • 请记住,成员是按照它们在类中的声明顺序进行初始化的,而不是在初始化列表中。
  • @Mike:是的,在 gcc (mac, linus) 中,根据标准,初始化列表必须与声明成员的顺序相同。如果您以不同的顺序执行此操作,Microsoft 编译器不会强制执行(或警告),但您不应依赖该行为。此外,使用“this”是危险的,因为您的对象尚未完全构建。如果您这样做,有些编译器会发出警告,有些则不会。
【解决方案2】:

使用初始化列表:

b::b() : aInstance(1) {}

【讨论】:

    【解决方案3】:

    只需使用如下定义的构造函数:

    class b {
    public:
        b()
        : aInstance(5)
        {}
        a aInstance;
    };
    

    【讨论】:

    • 使用成员变量,这仅在变量为static const 时才有效,如static const int x(3);
    • 我实际上应该注意,我没有将常量传递给构造函数,而是 b 的另一个成员。当我尝试做 aInstance(c);它将其解释为函数定义。
    • @Jerry: 并且具有整数类型。
    • 对不起,我的错,我在想什么...修复示例以使用初始化列表。
    • @Roger:是的,你也提到了。谢谢。
    【解决方案4】:

    前两个答案不起作用。您将类声明放在 .h 头文件中,将(成员)函数定义放在 .cpp 文件中。受访者放置的大括号 {} 定义了 b 构造函数块。实际上,没有人会想要那个空的。但是你不能在 .cpp 中正确定义它,否则编译器会报告“重新定义”错误。 (如果头文件在几个翻译单元中#included,链接器无论如何都会这样做)由于头文件的目的是它们可以包含在几个.cpp中,所以上面的答案是不可行的。

    【讨论】:

      【解决方案5】:

      我认为您应该使用指向“a”的指针,例如:

      class b {
      public:
          b() : aInstance(new a(5)) {}
          a *aInstance;
      };
      

      这样您就可以定义行为。当然,您需要在析构函数中释放 *aInstance。

      【讨论】:

      • 堆分配比堆栈分配更不受欢迎。您的代码现在缺少复制构造函数、赋值运算符和析构函数。
      • 我同意。我的评论有点太快了,特别是因为 aInstance 只是一个小对象。我在考虑现实生活中的情况,对象可能更大,你可能有延迟初始化等。我想我最近做了太多 C# 和 Java,几乎所有事情都是通过引用完成的;)
      猜你喜欢
      • 2011-08-09
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 2010-10-30
      • 2011-09-03
      相关资源
      最近更新 更多