gpt4 book ai didi

c++ - std::ostream 需要功能方面的帮助

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

我需要有人逐部分向我解释这些代码行,我需要一些帮助来使用简单示例的“ostream”。谢谢 :)。

inline std::ostream& operator<<(std::ostream& os, const Telegram& t)
{
os << "time: " << t.DispatchTime << " Sender: " << t.Sender
<< " Receiver: " << t.Receiver << " Msg: " << t.Msg;

return os;
}

更新 1:当我使用此函数时,它无法编译并且错误提示:

std::ostream& class::operator<<(std::ostream& os, const Telegram& t) 必须只有一个参数

最佳答案

这些行只是将处理 Telegram 对象的能力添加到标准输出流类。

当你添加一个新类并且你想要像cout这样的输出流时要智能地处理它们,您需要添加一个新的 <<将新对象类型作为第二个参数的运算符方法。

上面的代码就是这么做的。当您稍后执行语句时:

Telegram tg("Bob", "Hello, how are you?");
cout << tg;

你问题中的那个函数将被调用,流作为第一个参数,你的 tg对象作为第二个参数,然后它将能够以适合类的格式输出数据。

这实际上是我难以理解的早期 C++ 事物之一。尽管该类应该是独立的,但您实际上是在向不同 类添加一些内容来处理输出。一旦您理解了为什么会发生这种情况(因为它是 ostream 类而不是您自己的类负责输出内容),它很有可能是有意义的。


希望用一个更简单的例子让它更清楚:

1    inline std::ostream& operator<<(std::ostream& os, const Telegram& t) {
2 os << "message: " << t.Msg;
3 return os;
4 }

第 1 行只是函数定义。它允许您返回流本身(您传入的),因此您可以链接 <<段。 operator<<只是您提供的功能,当您输入 << tg 时调用的功能进入输出流语句。

第 2 行使用更基本的 <<已经定义的语句(在这种情况下,无论 Msg 是什么类型,都可能是一个字符串)。

然后第 3 行返回流,再次允许链接 << segmentation 市场。

基本思想是提供operator<<建立在现有 operator<< 基础上的功能构成您的类型的数据类型的函数。


还有一个简单的包装类,只包含一个 int :

#include <iostream>

// This is my simple class.

class intWrapper {
public:
intWrapper (int x) { myInt = x; };
int getInt (void) { return myInt; }
private:
int myInt;

// Must be friend to access private members.

friend std::ostream& operator<< (std::ostream&, const intWrapper&);
};

// The actual output function.

inline std::ostream& operator<< (std::ostream& os, const intWrapper& t) {
os << "int: " << t.myInt;
return os;
}

// Main program for testing.
// Output with getter and with ostream.

int main (void) {
class intWrapper x(7);
std::cout << x.getInt() << std::endl; // ostream already knows about int.
std::cout << x << std::endl; // And also intWrapper, due to the
// function declared above.
return 0;
}

这个输出:

7
int: 7

第一个通过调用 getter 函数来检索整数,第二个通过调用 <<我们添加到 ostream 的运算符函数.

关于c++ - std::ostream 需要功能方面的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801196/

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