以下代码在cpp.sh运行时有效:
#include <iostream>
class B{
public:
B(int i);
int i;
};
B::B(int i) {
this->i = i;
}
class A{
public:
A(B *b);
B *b;
};
A::A(B *b) {
this->b = b;
}
int main()
{
B b(8);
A a(&b);
std::cout << a.b->i;
}
它创建一个类型为B
的对象,并将指针存储在类型为A
的对象中。
我想要做的是只传递整数(在本例中为8)并在a
中创建并存储完整对象而不创建中间对象。
但是当我尝试在A中声明一个B类型的对象(而不仅仅是一个指针)时,我得到一个no matching function for call to 'B::B()
错误。
这是我尝试的方法,但不起作用:
#include <iostream>
// B i not changed
class B{
public:
B(int i);
int i;
};
B::B(int i) {
this->i = i;
}
class A{
public:
A(int i);
B b;
};
A::A(int i) {
this->b(i); //initialize
}
int main()
{
A a(8);
std::cout << a.b->i;
}
为什么在声明B b;
变量而不是指针B *b;
时出现“无匹配函数”错误?
我的方法this->b(i);
是否在声明正确后初始化成员?
答案 0 :(得分:3)
您的类B
没有提供不带参数的构造函数(一旦您声明任何其他构造函数,隐式定义的默认构造函数就会被删除)。
当您使用类型为A
的数据成员定义另一个类class B
时,除非您明确定义应使用哪些参数的B
构造函数,否则系统无法初始化此数据成员。
你可以通过......克服这一点。
在b
的构造函数的成员初始值设定项列表中调用A
的构造函数,即A::A(int i) : b(i) {}
在定义数据成员b
时默认初始化,即在A
中,写B b = B(1)
;
在B
中定义(用户定义的)默认构造函数,例如B() : i(0) {}
在B
的(唯一)构造函数中定义默认值,例如B(int i=0)
我更喜欢选项1;选项2..4仅为完整性而列出。
请注意,构造函数体中的任何代码(不管代码是什么)都不被视为“数据成员初始化”。