我不习惯使用c ++而且编写构造函数时遇到问题 看到这个例子,是我正在处理的代码的简短版本:
class B {
public:
B(int x);
}
class A {
public:
B b;
A(){
// here I have to initialize b
}
}
抛出编译器错误,因为我需要在A的构造函数中初始化b,因为B没有默认的构造函数。
我想我已经在初始化列表中做了,但是B(int x)参数是我必须用某种算法计算的值,所以我不知道应该如何正确完成,或者如果我'我错过了什么或做错了。
在像java这样的其他语言中,我会引用B并在A的构造函数中初始化它,之后需要获取初始化值的其他代码。
在这种情况下,初始化b的正确方法是什么?
谢谢!
答案 0 :(得分:11)
您可以在构造函数初始化列表
中调用函数class B {
public:
B(int x);
}; // note semicolon
class A {
public:
B b;
A()
:b(calculateValue()) {
// here I have to initialize b
}
static int calculateValue() {
/* ... */
}
}; // note semicolon
请注意,在初始化列表中,该类被认为是完全定义的,因此您也可以看到稍后声明的成员。最好不要在构造函数初始化列表中使用非静态函数,因为此时尚未初始化所有成员。静态成员函数调用很好。
答案 1 :(得分:1)
您使用初始化列表,如下所示:
A() : b(f(x)) {}
答案 2 :(得分:-1)
#include<iostream>
class B {
public:
B(){} // A default constructor is a must, if you have other variations of constructor
B(int x){}
}; // class body ends with a semicolon
class A {
private:
B b;
public:
A(){
// here I have to initialize b
}
void write(){
std::cout<<"Awesome";
}
};
int main(){
A a;
a.write();
}
在C ++中,如果你有一个带参数的构造函数,那么必须使用默认构造函数,这与其他语言不同。这就是你需要改变的全部。感谢。