C++ 运算符<<类的成员

c++ operator<< member of class

本文关键字:lt 成员 运算符 C++      更新时间:2023-10-16

我有&lt;&lt;C 的操作员。我需要此操作工作:

  cout << comp2 << comp1;

class Compo
{
    string name;
    int power;
    string app;
public:
    Compo(string s, string a, int p):name(s), power(p),app(a){};
    //~Compo();    
     string GetAsString()const{
        ostringstream oss;    
        oss << name << " [ " << power << " ] desc: " << app << endl;        
        return oss.str();
    };

     string &operator<<(Compo& aux)const{               
        return aux.GetAsString();
    };
};
void main()
{
    Compo comp1("Pencil","Best",12);
    Compo comp2("Notes","Not Best",22);
    cout << comp2 << comp1;        
    cin.get();
}

我在cout << comp2上有ERRO

错误描述是

错误C2679:二进制'&lt;&lt;':没有发现右手的操作员 类型" compo"的操作数(或没有可接受的转换)

和一个警告,

返回本地变量或临时变量的地址

ho我需要对此作品进行更改。

您需要声明独立输出操作员方法来执行此操作(免费类功能)。

std::ostream& operator<<(std::ostream& os, const Compo& obj)
{
    obj.put(os);
    return os;
}

Compo类中有:

// ...
public:
    void put(std::ostream& os) const
    {
        // output member values here ...
    }
// ...

更新:
或或者(如果实际上无法更改Comp):

std::ostream& operator<<(std::ostream& os, const Compo& obj)
{
    os << obj.GetAsString();
    return os;
}

IMHO我在这里提出的第一个解决方案是更灵活的解决方案,最终满足了未来的要求。它可以与不处理弦乐格式的std::ostream实现一起使用。

您需要类似此操作员的东西:

ostream& operator << (ostream& o, const Compo& c)
{
   return o << c.GetAsString();
}

编译器找不到任何操作员&lt;&lt;作为左参数std::ostream和正确参数Compo。您定义了一个将左参数作为std::string和正确的参数Compo定义。尝试:

class Compo{
//Stuff
public:
    friend ostream& operator<<(ostream& os, Compo& aux);
};
ostream& operator<<(ostream& o, const Compo& aux)
{
    o << name << " [ " << power << " ] desc: " << app << endl;
    return o;
}
#include <iostream>
using namespace std;
class Compo
{
    string name;
    int power;
    string app;
public:
    friend ostream& operator<< (ostream&, const Compo&);
     ....
     .....
};
ostream& operator<< (ostream& out, const Compo& c)
{
   out << c.name << "[" << c.power << " ] desc: " << c.app << endl;
}