为ostream分配引用参数来引用成员变量 - C++

问题描述 投票:0回答:1

我无法将对

std::ostream
的引用传递给类构造函数并将其分配给引用成员变量。

我有两个文件:

// ./include/HelloWorld.hpp
#ifndef __HELLOWORLD_H__
#define __HELLOWORLD_H__

#include <iostream>
#include<string>

class HelloWorld {
    public:
        HelloWorld(std::ostream& MyOut);
        void say();
    private:
        std::ostream &output;
};

#endif
// ./src/HelloWorld.cpp
#include "../include/HelloWorld.hpp"

HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut){
    output = MyOut; // Error is thrown here
};

void HelloWorld::say(){
    this->output << "Hello World4!" << '\n';
}

当我跑步时:

g++ -c -fPIC -Wall -Werror -o bin/HelloWorld.o src/HelloWorld.cpp

我收到以下错误:

src/HelloWorld.cpp: In constructor ‘HelloWorld::HelloWorld(std::ostream&)’:
src/HelloWorld.cpp:5:14: error: use of deleted function ‘std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator=(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’
    5 |     output = MyOut; // Error is thrown here
      |              ^~~~~
In file included from /usr/include/c++/9/iostream:39,
                 from src/../include/HelloWorld.hpp:5,
                 from src/HelloWorld.cpp:2:
/usr/include/c++/9/ostream:405:22: note: declared here
  405 |       basic_ostream& operator=(const basic_ostream&) = delete;
      |                      ^~~~~~~~

由于这个问题,我假设我没有将引用分配给引用。但是,据我了解,我相信成员变量和构造函数参数都被定义为引用。

我在这里误解了什么?

c++ constructor pass-by-reference member ostream
1个回答
0
投票

这里

HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut){   // I
    output = MyOut; // Error is thrown here
};

您从初始化器列表中的

output
正确初始化了成员引用
MyOut
I

然后,

II
,尝试将
MyOut
分配给
output
,这两者都是对同一个ostream的引用。如果可以编译,它将什么也不做,因为它尝试将相同的 ostream 分配给自己。但是,无法分配或复制
std::ostream
,这就是您收到错误的原因。

解决方案是在成员初始值设定项列表中初始化该成员,而不是在构造函数体内对其进行赋值:

HelloWorld::HelloWorld(std::ostream &MyOut) : output(MyOut) {}
© www.soinside.com 2019 - 2024. All rights reserved.