我有一个Rectangle
类,其成员变量类型为PrintManager
。 PrintManager
在其构造函数中使用ostream引用。
class PrintManager
{
public:
PrintManager();
PrintManager(ostream&);
~PrintManager();
private:
ostream& stream;
};
PrintManager::PrintManager(ostream& fileStream) : stream(fileStream){}
Rectangle.h
class Rectangle
{
public:
Rectangle();
~Rectangle();
Rectangle(int, int);
Rectangle(int, int, PrintManager);
private:
PrintManager manager;
};
Rectangle.cpp
Rectangle::Rectangle(int length, int width) :length(length), width(width)
{
//error here
manager = PrintManager(cout);
}
Rectangle::Rectangle(int length, int width, PrintManager manager) : length(length), width(width), manager(manager)
{
//no error here
}
我知道引用不能反弹,但我不明白为什么我不能在其构造函数中没有传递PrintManager的Rectangle
构造函数。我没有将任何内容重新分配给stream参数,只是用cout
答案 0 :(得分:3)
您正在使用赋值运算符来复制PrintManager对象,这是不允许的,因为它有一个引用成员,您应该这样做:
Rectangle::Rectangle(int length, int width)
:length(length), width(width), manager(PrintManager(out))
{
}
将调用PrintManager的复制构造函数。
答案 1 :(得分:3)
因为您将PrintManager
项目存储为值,所以当调用Rectangle
构造函数时,编译器会尝试将PrintManager
对象构造为好吧,它会失败,因为它包含一个需要初始化的引用。
解决方案看似简单:初始化PrintManager
初始化列表中的Rectangle
对象:
Rectangle::Rectangle(int length, int width)
:manager(std::cout), length(length), width(width)
{ }