有没有一种方法可以使用该类的构造函数来初始化另一个类的private部分内部的对象数组?

时间:2020-06-09 09:20:35

标签: c++

我有一个名为“作者”的类和另一个名为“书”的类,我想在该类书的私有内部包含一个作者数组,并希望在构造函数中对其进行初始化。


#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()没有匹配功能

2 个答案:

答案 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时在此处固定大小的原因是什么?