12

我有两节课

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;
}

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

4

5 回答 5

24

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

b() : aInstance(3) {} 

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

于 2010-01-18T20:26:55.670 回答
3

使用初始化列表:

b::b() : aInstance(1) {}
于 2010-01-18T20:27:39.427 回答
0

只需使用这样定义的构造函数:

class b {
public:
    b()
    : aInstance(5)
    {}
    a aInstance;
};
于 2010-01-18T20:28:08.573 回答
0

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

于 2019-11-13T23:31:41.610 回答
-2

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

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

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

于 2010-01-18T21:06:04.393 回答