gpt4 book ai didi

c++ - 重载运算符<<

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

我正在制作一个使用 operator<< 的简单类.它将存储两个并行数据数组,每个数组具有不同(但已知)的数据类型。这个想法是最终界面看起来像这样:

MyInstance << "First text" << 1 << "Second text" << 2 << "Third text" << 3;

这将使数组看起来像这样:

StringArray: | "First text" | "Second text" | "Third text" |
IntArray: | 1 | 2 | 3 |

我可以处理检查输入以确保一切匹配的逻辑,但我对 operator<< 的技术细节感到困惑。 .

我查过的教程说用 std::ostream& 重载它作为友元函数返回类型,但我的类(class)与流无关。我尝试使用 void作为返回类型,但出现编译错误。最终我返回了对该类的引用,但我不确定为什么会这样。

到目前为止,这是我的代码:

class MyClass
{
public:

MyClass& operator<<(std::string StringData)
{
std::cout << "In string operator<< with " << StringData << "." << std::endl;

return *this; // Why am I returning a reference to the class...?
}

MyClass& operator<<(int IntData)
{
std::cout << "In int operator<< with " << IntData << "." << std::endl;

return *this;
}
};

int main()
{
MyClass MyInstance;
MyInstance << "First text" << 1 << "Second text" << 2 << "Third text" << 3;

return 0;
}

此外,我类的用户可以做这样的事情,这是不受欢迎的:

MyInstance << "First text" << 1 << 2 << "Second text" << "Third text" << 3;

我可以做些什么来强制输入的交替性质?

最佳答案

原因ostream运算符返回对 ostream 的引用,以及它在某种程度上帮助您的案例返回对 MyClass 的引用的原因是像A << B << C这样的表达吗?总是被解释为 (A << B) << C .也就是说,无论第一个重载运算符返回什么,都会成为下一个运算符调用的左侧。

现在,如果你想要像 MyInstance << "First text" << 1 << 2 这样的表达式要产生编译器错误,您需要确保在前两个 << 之后返回的类型运算符是一种不能用另一个 int 调用的类型。我认为这样的事情可能会做你想做的事(感谢@Pete Kirkham 提出了一个很好的改进想法):

struct MyClass_ExpectInt;
class MyClass {
private:
friend MyClass& operator<<(const MyClass_ExpectInt&, int);
void insert_data(const std::string& StringData, int IntData);
// ...
};
struct MyClass_ExpectInt {
MyClass& obj_ref;
std::string str_data;
explicit MyClass_ExpectInt( MyClass& obj, const std::string& str )
: obj_ref( obj ), str_data( str ) {}
};
MyClass_ExpectInt operator<<( MyClass& obj, const std::string& StringData )
{
// Do nothing until we have both a string and an int...
return MyClass_ExpectInt( obj, StringData );
}
MyClass& operator<<( const MyClass_ExpectInt& helper, int IntData )
{
helper.obj_ref.insert_data( helper.str_data, IntData );
return helper.obj_ref;
}

这将是仅有的两个重载 operator<<您定义的与 MyClass 相关的函数.这样,每次调用 operator<< ,编译器将返回类型从 MyClass& 切换为至 MyClass_ExpectInt反之亦然,并将“错误”类型的数据传递给 operator<<绝不允许。

关于c++ - 重载运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5171529/

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