c++ - 重载运算符 >> 和 << 以便它接受用户定义的对象

标签 c++ stream overloading

我有一个包含多个字符串(字符串指针)的对象(属于 myObj 类)。我想重载 >> 运算符,以便我可以一次读取多个字符串。

这个重载的运算符函数接受如下语句:

辛>>海峡;

计算<

唯一的问题是,当我填写一系列字符串时,似乎只有第一个字符串在流中得到正确处理。

插入:

istream &operator>>(istream &is, myObj &obj)
{
    std::string line;

    while (true)
    {
        std::getline(is, line);
        if (not is)
            break;
        obj.add(line);
        is >> line;
    }

    return is; 
}

提取

ostream &operator<<(ostream &os, myObj const &obj)
{
    for(size_t idx = 0; idx != obj.size(); ++idx) 
        os << obj[idx];
    return os;
}

代码编译正常,但当我计算对象时,只打印第一个字符串,其他字符串被省略。

所以当我为 cin 提供:

Hi
Stack
Exchange

只会显示 Hi。

有人知道为什么会这样吗?

提前致谢!

P.S 我是 Stack Exchange 的新手,我正在尽我所能努力解决问题 :)

最佳答案

你的循环将像这样工作:

std::getline(is, line);

提取并存储中的“Hi”,提取换行符

obj.add(line);

将“Hi”添加到 obj

is >> line;

中提取并存储“Stack”,不提取后面的换行符

std::getline(is, line);

提取空字符串并将其存储在中,因为下一个读取的字符是换行符

obj.add(line);

将空字符串 ""添加到 obj

is >> line;

中提取和存储“Exchange”

std::getline(is, line);

什么都不提取(输入流结束)

if (not is)
    break;

然后流结束,您的循环退出。

结论:你只存储了 Hi 和一个空字符串

关于c++ - 重载运算符 >> 和 << 以便它接受用户定义的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962333/

相关文章:

python - 使用流重定向 python 日志消息

c++ - C++ 中继承的重载规则

c# - 虚方法的重载解析

c++ - VBA 中的 "Invalid use of New Keyword"使用用 C++ 编写的旧 com 对象

java - 放弃控制权 : machine code generation vs memory layout?

java - 在orElseThrow中执行多行

Php 套接字与流

java - 使用枚举类型重载

c++ - EncryptFile 函数是如何工作的,为什么我仍然可以保存内容?

c++ - 函数声明 __declspec(naked) 如何存储局部变量?