我有一个名为“作者”的类和另一个名为“书”的类,我想在该类书的私有内部包含一个作者数组,并希望在构造函数中对其进行初始化。
#include<iostream>
#include<string>
using namespace std;
class author
{
string name;
string email;
public:
author(string name,string email):name{name},email{email}{}
...
};
class book
{
double price;
string name;
author writer[3];
public:
book(double price,string name,author writer[3]):price{price},name{name},writer[3]{writer[3]}{}
....
};
int main()
{
...
return 0;
}
我收到此错误“调用'author :: author()没有匹配功能
答案 0 :(得分:1)
这与构造函数无关,但与您尝试初始化C样式数组的方式无关。如果要使用C样式的数组,则需要显式复制所有元素:
book(double price,string name,author writer[3])
: price{price}
, name{name}
, writer{writer[0], writer[1], writer[2]}
{}
请注意,这并不安全-编译器不会检查数组的大小,因此它将编译您提供了两个元素的数组,但是您将具有未定义的行为。除非author
具有默认构造函数,否则您也不能使用循环。
更合理的方法是使用std::vector
-它使您拥有任意数量的作者,而不是每本书固定3位作者。
class book
{
double price;
string name;
std::vector<author> writer;
public:
book(double price,string name,std::vector<author> writer)
: price{price}
, name{name}
, writer{std::move(writer)}
{}
....
};
答案 1 :(得分:0)
原始数组在C语言中不是一流的对象,在C ++中也不是:您不能分配给数组,也不能直接从另一个数组初始化它。您只能分配给它的各个元素,或从其他元素初始化它。
如果您真的想那样做,则必须写:
book(double price,string name,author writer[3]):price{price},name{name},
writer{writer[0], writer[1], writer[2]}{}
因此,标准C ++库提供了std::array
,它只是原始数组的一个很小的包装,但是允许直接初始化或从另一个数组进行赋值。但是正如您在评论中告诉您的那样,当您可以使用std::vector
时在此处固定大小的原因是什么?