0

我一生都无法理解为什么这不起作用。我感到很困惑。我有一个 Person 类,它有一个数据成员年龄,我只想添加两个人以便添加年龄。我不知道为什么这这么难,但我正在寻找例子,我觉得每个人都在做不同的事情,出于某种原因,他们都没有工作。有时我看到的示例有两个参数,有时它们只有一个,有时参数是对对象的引用,有时它们不是,有时它们返回一个 int,有时它们返回一个 Person 对象。就像..最正常的方法是什么?

class Person {
    public: 
        int age;
        //std::string haircolor = "brown";
        //std::string ID = "23432598";

        Person(): age(19) {}

        Person operator+(Person&) { }
};

Person operator+(Person &obj1, Person &obj2){
    Person sum = obj1;
    sum += obj2;
    return sum;
}

我真的觉得重载 + 运算符应该是世界上最简单的事情,除非我不知道我在做什么。我不知道我是否应该在类内部创建重载函数,如果它有区别,为什么如果我在里面做它只允许一个参数,老实说我不明白。

4

3 回答 3

1

尝试这个:

class Person {
public: 
    int age;
//std::string haircolor = "brown";
//std::string ID = "23432598";

    Person(): age(19) {}

    Person operator+ (const Person&); // Skip the definition for later.
};

Person Person::operator+ (const Person& other) { // Declare as member of Person::
    Person sum;
    sum.age = this->age + other.age; // All member functions have pointer: this.
    return sum;
}

或者使操作员成为非成员:

Person operator+ (const Person& p1, const Person& p2) { // Non-member don't have pointer: this
    Person sum;
    sum.age = p1.age + p2.age;
    return sum;
}

运算符重载可以是成员或非成员,这是您的选择。请参阅此链接以获取有关在成员和非成员运算符重载之间进行选择的指南的更多信息。

注意:通常的做法是声明类的成员变量private以不公开实现。然而,这将导致非成员运算符重载,不再访问Person对象的成员age。解决方案(和常见做法)是将非成员运算符函数添加为 a friendto Person。然后非成员函数将可以访问私有成员age

class Person {
friend Person operator+ (const Person&, const Person&);
private: 
    int age;
    // ...
public:
    // ...
}
于 2013-10-25T02:15:31.457 回答
0

看起来您正在尝试同时执行两种运算符重载方法,而您只需要执行一种。

要修复您的代码,请Person operator+(Person&) { }从 Person 定义中删除。

不同的是,一个是成员,一个是自由函数。两者都有优点,在某些情况下必须使用其中之一。特别是成员可以访问私有成员而不被声明为朋友,并且 operator() 需要是成员。一些运算符最好作为自由函数实现,例如,您希望将 int 等基本类型与您的类结合起来。

在这种情况下,没有一个比另一个有任何特别的优势。

于 2013-10-25T02:26:48.103 回答
0

Person中,实现Person& operator+=(Person const& other)将 a 增加Person另一个。

将您的免费签名更改operator+为取Person const &s 而不是引用。

鲍勃是你的叔叔。

于 2013-10-25T02:48:34.617 回答