You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:53:12