在构造函数中具有引用的成员类型上,等于运算符不可用

时间:2015-02-17 01:18:24

标签: c++

我有一个Rectangle类,其成员变量类型为PrintManagerPrintManager在其构造函数中使用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

初始化它

2 个答案:

答案 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)
{ }