如何使用C ++在这种特定情况下正确地重载操作符

时间:2015-10-30 00:12:21

标签: c++

我是C ++编程的新手,并且无法实现此运算符重载。它给出的错误是没有操作员"<<&#匹配这些操作数。

class class1{

public:
    bool operator==(class1 &);
    friend ostream & operator<<(ostream &, class1 &);

private:
    string name;
};

/*Friend ostream & operator <<*/
ostream & operator << (ostream & os, class1 & obj){
    os << obj.name;
    return os;
}

有人提到我需要另一个重载运算符,但我无法弄清楚如何让它与另一个重载运算符一起工作

3 个答案:

答案 0 :(得分:1)

以下是您的代码的情况;您的类中有一个私有成员字符串变量,其中没有外部对象可以设置此变量。您的类不包含已定义的构造函数或设置方法。当我尝试你的代码时,我不得不改变你的操作符声明和定义:

std::ostream& operator<<( std::ostream& os, class1& obj );

到此:

std::ostream& operator<<( std::ostream& os, const class1& obj );

为了编译它。但是,在构建项目时,我收到了一个未解析的标识符的链接器错误。这里发生的事情是你声明作为你的类对象的朋友的ostream对象确实知道私有成员字符串但它不能对它做任何事情,因为这个字符串是空的或无效的。我把你的班级改为:

#include <conio.h>
#include <string>
#include <iostream>

class class1 {
    friend std::ostream& operator<<( std::ostream& out, const class1& other );

private:
    std::string m_strName;

public:
    explicit class1( std::string& strName ) : m_strName( strName ) {}

    void setName( std::string& strName ) { m_strName = strName; }
    std::string getName() const { return m_strName; }
};

std::ostream& operator << ( std::ostream& out, class1& obj ) {
    out << obj.m_strName << std::endl;
    // out << obj.getName() << std::endl;
    return out;
}

int main() {
    class1 a( std::string( "class1" ) );
    std::cout << a << std::endl;

    std::cout << "Press any key to quit" << std::endl;
    _getch();
    return 0;
}

这将正确编译,构建,链接和执行,并显示适当的文本和退出值为0,没有错误。我在Win7机器上使用MSV2013。主要问题是,由于您的类在构造时无法填充其字符串成员,因此ostream操作符对象无法解析正在使用的变量。

答案 1 :(得分:0)

如果你想让ostream成为公共成员,请删除ostream的关键字“friend”。如果你想要ostream成为朋友,请将其移到公众面前: operator ==应该有两个const参数,如果你不打算改变const。

friend ostream & operator<<(ostream &, const class1 &);
public:
bool operator==(const class1& x, const class1& y);

public:
bool operator==(const class1& x, const class1& y);
ostream & operator<<(ostream &, const class1 &);

make operator&lt;&lt; const的第二个参数可能有帮助

ostream & operator << (ostream & os, const class1 & obj){
os << obj.name;
return os;
}

答案 2 :(得分:0)

重载operator<<(std::ostream&, std::string)实际上是由#include <string>定义的。

虽然std::string也由该标头定义,但如果您没有包含该标头,则仍可以定义std::string,但不能定义此运算符重载。

C ++标准要求某些标头提供某些功能,但它并不禁止该功能也由另一个标头提供。在您的情况下,编译器/库编写器已经决定通过定义std::string来最容易地在另一个头中实现其他功能,但它可以通过使用定义std::string的单独文件来完成此操作。包括<string>和其他标题。