C++面向对象编程:为三类实现统一的>>和<<运算符重载
适配多类的C++输入输出运算符重载方案
要让同一对>>(提取)和<<(插入)运算符同时适配A、B、C三个类,我们可以通过模板函数+统一接口的方式实现,以下是具体步骤:
1. 修改类定义,添加统一的读写接口
给每个类添加用于处理输入输出的成员函数,并将运算符声明为友元(保证运算符能访问类的私有成员):
#include <iostream> class A{ private: int a,b; public: void read(std::istream& is) { is >> a >> b; } void write(std::ostream& os) const { os << a << " " << b; } // 声明模板运算符为友元 template<typename T> friend std::istream& operator>>(std::istream& is, T& obj); template<typename T> friend std::ostream& operator<<(std::ostream& os, const T& obj); }; class B{ private: int c,d,e; public: void read(std::istream& is) { is >> c >> d >> e; } void write(std::ostream& os) const { os << c << " " << d << " " << e; } template<typename T> friend std::istream& operator>>(std::istream& is, T& obj); template<typename T> friend std::ostream& operator<<(std::ostream& os, const T& obj); }; class C{ private: int f,g; public: void read(std::istream& is) { is >> f >> g; } void write(std::ostream& os) const { os << f << " " << g; } template<typename T> friend std::istream& operator>>(std::istream& is, T& obj); template<typename T> friend std::ostream& operator<<(std::ostream& os, const T& obj); };
2. 编写通用模板运算符重载
只需要实现一对模板形式的运算符,它们会调用每个类的read和write方法,自动适配所有实现了该接口的类:
template<typename T> std::istream& operator>>(std::istream& is, T& obj) { obj.read(is); return is; } template<typename T> std::ostream& operator<<(std::ostream& os, const T& obj) { obj.write(os); return os; }
3. 使用示例
现在可以直接用这两个运算符处理A、B、C类的对象:
int main() { A a; B b; C c; std::cout << "输入A的两个整数:"; std::cin >> a; std::cout << "输入B的三个整数:"; std::cin >> b; std::cout << "输入C的两个整数:"; std::cin >> c; std::cout << "\nA的内容:" << a << "\n"; std::cout << "B的内容:" << b << "\n"; std::cout << "C的内容:" << c << "\n"; return 0; }
这种方案的优势在于扩展性强——后续新增类时,只要添加read和write方法,就能自动适配这对运算符,无需修改重载函数本身。
内容的提问来源于stack exchange,提问作者Pawan Giri
相关产品推荐
相关产品推荐

