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

How do I properly overload the operator in this specific case using C++

本文关键字:C++ 何使用 正确地 重载 运算符 情况下      更新时间:2023-10-16

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

有人提到我需要另一个重载运算符,但我不知道如何让它与另一个过载运算符

一起工作

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

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

到此:

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

以便进行编译。然而,在构建项目时,我收到了一个未解析标识符的Linker错误。这里发生的情况是,您声明为类对象的朋友的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运算符对象无法解析正在使用的变量。

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

尽管std::string也由该标头定义,但如果不包括该标头,则仍然可以定义std::string,但不能定义此运算符重载。

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

如果您希望ostream成为公共成员,请删除它的关键字"friend"。如果你想让ostream成为朋友,请将其移至公众之上:运算符==应该有两个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 &);

使运算符<lt;第二个参数const可能有助于

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