与朋友一起处理运算符重载方法

时间:2018-12-08 10:23:38

标签: c++

我试图创建简单的类并重载其中的一些运算符,但是,我在一开始就失败了,这是我的代码:

#include <iostream>

class Person
{
    char *firstName;
    char *lastName;
    int age;
    friend std::ostream &operator<<(std::ostream &, const Person &);
public:
    Person() : firstName("Piotr"),  lastName("Tchaikovsky"), age(10) {}

    Person(char* f, char* l, int a)
    {
        this->firstName = f;
        this->lastName = l;
        age = a;
    }

    std::ostream &operator<<(std::ostream& out, const Person &p)
    {
        out << p.firstName << " " << p.lastName;
        return out;
    }

};

int main()
{
    Person a;

    getchar();
    getchar();
}

因此,在创建此运算符重载函数之前,我使用调试器查看了构造函数是否可以正常运行,并且它可以正常工作,因为默认值已正确赋给我创建的变量a,之后,所有i这样做是因为我创建了一个重载运算符<<的函数,并且它是我班上的一个朋友函数,因为我被告知由于重载函数的第一个参数的类型,这是一件好事,但是,当我尝试运行此命令时(注意:我还没有尝试打印出任何东西,我想先检查一下是否一切正常),这会给我错误提示:

“此运算符的参数太多”,

“二进制'运算符<<'参数太多”和

“'Person :: operator <<':函数声明中的错误;跳过函数主体”

但是,我找不到函数声明的任何问题,而且我可能看不到该函数的两个参数可能太多。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

您将friend函数声明为全局非成员函数。然后定义一个 member 函数。

operator<<函数的定义移到类之外:

class Person
{
    ...
    friend std::ostream &operator<<(std::ostream &, const Person &);
    ...
};

std::ostream &operator<<(std::ostream& out, const Person &p)
{
    out << p.firstName << " " << p.lastName;
    return out;
}

Or 或者内联定义 friend 函数:

class Person
{
    ...
    friend std::ostream &operator<<(std::ostream &, const Person &)
    {
        out << p.firstName << " " << p.lastName;
        return out;
    }
    ...
};