如何为成员使用非默认构造函数?

时间:2010-01-18 20:24:21

标签: c++ class constructor default member

我有两个班级

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

如何获取它以便使用(int i)实例化aInstance而不是尝试搜索默认构造函数?基本上,我想从b的构造函数中控制对构造函数的调用。

5 个答案:

答案 0 :(得分:22)

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

b() : aInstance(3) {} 

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

答案 1 :(得分:3)

使用初始化列表:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

前两个答案不起作用。您将类声明放入.h头文件中,并将(成员)函数定义放入.cpp文件中。受访者放置的大括号{}定义了b构造函数块。实际上,没有人会想要那空的。但是,您无法在.cpp中正确定义它,否则编译器将报告“重新定义”错误。 (就像头文件被#包含在多个翻译单元中一样,链接程序也是如此。)由于头文件的目的是可以将它们包含在多个.cpp中,因此上述答案不可行。

答案 4 :(得分:-2)

我认为你应该使用指向'a'的指针,如:

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

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