c ++运算符<<班级成员

时间:2014-01-18 19:57:35

标签: c++ operators

我的<<<<< 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

上有错误

错误描述是,

  

错误C2679:二进制'&lt;&lt;' :找不到哪个操作员需要右手   'Compo'类型的操作数(或没有可接受的转换)

和一个警告,

  

返回局部变量的地址或临时

我需要改变这项工作。

4 个答案:

答案 0 :(得分:1)

您需要声明一个独立的输出运算符方法来执行此操作(无类函数)。

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;
}

恕我直言,我在这里提出的第一个解决方案是更灵活的解决方案,最终满足未来的需求。它可能与std::ostream的实现一起使用,它们不处理stringyfied格式。

答案 1 :(得分:0)

编译器找不到任何运算符&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;
}

答案 2 :(得分:0)

你需要这样的操作符:

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

答案 3 :(得分:0)

#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;
}