如何为Dice类实现全局插入<<和提取>>运算符重载
问题解答
你当前写的实现已经属于全局实现,无需额外调整核心结构,具体说明如下:
- 插入
<</提取>>运算符的左操作数分别是ostream/istream类型对象,天然无法作为Dice类的成员函数实现(类成员函数的第一个隐含参数是类自身的this指针,会要求左操作数必须是Dice对象,和我们常规的使用习惯cout << dice对象冲突),所以只能以全局函数的形式实现。 - 你在Dice类内将这两个运算符声明为友元,只是为了让全局函数可以访问Dice类的私有成员
a,并不会改变这两个函数的全局属性。
你现有代码唯一不符合通用规范的点是operator>>的实现里硬编码了cout << "Enter a: ";的输出逻辑:
提取运算符仅应该负责从输入流读取数据赋值给对象的逻辑,不应该额外输出提示信息。否则当你从文件流、字符串流等非标准输入流读取Dice对象时,也会在标准输出打印无关提示,不符合功能单一原则。
以下是修正后的完整实现示例:
#include <iostream> using namespace std; // 示例为简化写法,实际项目不推荐全局using std class Dice{ int a; // 私有数据成员 // 声明全局的插入、提取运算符为友元,开放私有成员访问权限 friend ostream & operator << (ostream &out, const Dice &D); friend istream & operator >> (istream &in, Dice &D); }; // 全局作用域下实现operator<< ostream & operator << (ostream &out, const Dice &D) { out << D.a; return out; } // 全局作用域下实现operator>> istream & operator >> (istream &in, Dice &D) { in >> D.a; return in; } // 调用示例 int main() { Dice d; cout << "请输入Dice的a值:"; // 提示逻辑放到调用侧,适配不同使用场景 cin >> d; cout << "Dice的a值为:" << d << endl; return 0; }
内容的提问来源于stack exchange,提问作者Nauman Malik
相关产品推荐
相关产品推荐

