gpt4 book ai didi

c++ - 输出流作为类成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:19 24 4
gpt4 key购买 nike

我有一个 C++ 库,它提供了一个具有复杂逻辑的对象。在数据处理期间,此对象会向 std::cout 输出很多内容(现在已硬编码)。我希望处理输出不要转到标准输出,而是转到自定义小部件(显示一些文本)。我试图创建一个 std::ostream 类成员,用参数设置它(控制台应用程序的 std::cout 和在 GUI 应用程序内部处理的其他一些 ostream)。但是编译器抛出以下错误:

[ 14%] Building CXX object src/core/CMakeFiles/PietCore.dir/pvirtualmachine.cpp.o/usr/include/c++/4.6/ostream: In constructor ‘PVirtualMachine::PVirtualMachine(QString)’:                                                                        /usr/include/c++/4.6/ostream:363:7: error: ‘std::basic_ostream::basic_ostream() [with _CharT = char, _Traits = std::char_traits]’ is protected/home/tomasz/Development/C++/piet/src/core/pvirtualmachine.cpp:33:50: error: within this contextIn file included from /usr/include/c++/4.6/ios:45:0,                 from /usr/include/c++/4.6/ostream:40,                 from /usr/include/c++/4.6/iterator:64,                 from /usr/include/qt4/QtCore/qlist.h:50,                 from /usr/include/qt4/QtCore/qvector.h:48,                 from /usr/include/qt4/QtGui/qpolygon.h:45,                 from /usr/include/qt4/QtGui/qmatrix.h:45,                 from /usr/include/qt4/QtGui/qtransform.h:44,                 from /usr/include/qt4/QtGui/qimage.h:45,                 from /usr/include/qt4/QtGui/QImage:1,                 from /home/tomasz/Development/C++/piet/src/core/pcodepointer.h:17,                 from /home/tomasz/Development/C++/piet/src/core/pblockmanager.h:9,                 from /home/tomasz/Development/C++/piet/src/core/pvirtualmachine.h:10,                 from /home/tomasz/Development/C++/piet/src/core/pvirtualmachine.cpp:4:/usr/include/c++/4.6/bits/ios_base.h: In member function ‘std::basic_ios& std::basic_ios::operator=(const std::basic_ios&)’:/usr/include/c++/4.6/bits/ios_base.h:791:5: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private/usr/include/c++/4.6/bits/basic_ios.h:64:11: error: within this contextIn file included from /usr/include/c++/4.6/iterator:64:0,                 from /usr/include/qt4/QtCore/qlist.h:50,                 from /usr/include/qt4/QtCore/qvector.h:48,                 from /usr/include/qt4/QtGui/qpolygon.h:45,                 from /usr/include/qt4/QtGui/qmatrix.h:45,                 from /usr/include/qt4/QtGui/qtransform.h:44,                 from /usr/include/qt4/QtGui/qimage.h:45,                 from /usr/include/qt4/QtGui/QImage:1,                 from /home/tomasz/Development/C++/piet/src/core/pcodepointer.h:17,                 from /home/tomasz/Development/C++/piet/src/core/pblockmanager.h:9,                 from /home/tomasz/Development/C++/piet/src/core/pvirtualmachine.h:10,                 from /home/tomasz/Development/C++/piet/src/core/pvirtualmachine.cpp:4:/usr/include/c++/4.6/ostream: In member function ‘std::basic_ostream& std::basic_ostream::operator=(const std::basic_ostream&)’:/usr/include/c++/4.6/ostream:57:11: note: synthesized method ‘std::basic_ios& std::basic_ios::operator=(const std::basic_ios&)’ first required here /home/tomasz/Development/C++/piet/src/core/pvirtualmachine.cpp: In member function ‘void PVirtualMachine::setOutput(std::ostream)’:/home/tomasz/Development/C++/piet/src/core/pvirtualmachine.cpp:216:11: note: synthesized method ‘std::basic_ostream& std::basic_ostream::operator=(const std::basic_ostream&)’ first required here

如果有人指出我哪里出了问题,我会很高兴,因为我不知道...

我的代码是这样的:

  • .h文件
class PVirtualMachine {  private:    std::ostream output;    [...]  public:    void setOutput(std::ostream);    [...]};
  • .cpp文件
void PVirtualMachine::setOutput(std::ostream os){  output = os;}

最佳答案

这里有两个选择:

  • 使用引用,或
  • 使用指针

您不能使用普通实例,因为 ostream 是不可复制的。

使用引用(直接引用一个已经实例化的ostream)

class PVirtualMachine {
private:
std::ostream & output;
[...]
public:
PVirtualMachine(std::ostream &); // Reference must be initialized on construction.
[...]
};

优点:

  • 没有指针语法。
  • 应该始终引用 std::ostream 的有效实例,只要原始变量未被删除。

缺点:

  • PVirtualMachine 类必须使用初始化列表中的输出引用来构造,否则将无法编译。
  • 引用一旦初始化就无法更改。
  • 无法使用移动赋值运算符(即 operator=(PVirtualMachine &&))

使用指针(对象的可选引用)

class PVirtualMachine {
private:
std::ostream * output;
[...]
public:
void setOutput(std::ostream *);
[...]
};

优点:

  • 可以实例化为空指针。
  • 可以轻松传递。
  • 可以更新为指向新的 std::ostream 实例。
  • 可以在 PVirtualMachine 实例的内部或外部创建。
  • 与移动赋值运算符一起工作。

缺点:

  • 指针语法。
  • 在访问 ostream 和/或构造函数时必须检查空引用。

关于c++ - 输出流作为类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com