2013-10-25 133 views
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; 
} 

我真的觉得超载+运营商应该认真是世界上最容易的事情,除了我不知道我在做什么。我不知道我是否应该在类内部创建重载函数,如果它有所作为,为什么如果我在里面做它只允许一个参数,我只是老实说不明白。

+0

[运算符重载](http://stackoverflow.com/questions/4421706/operator-overloading) – chris

+0

尝试'人总和= obj1.age + obj2.age;'我认为这就是你要找的。 – BrainSteel

+1

当您将其作为成员函数编写时,该函数中的代码将在expresion的lhs的上下文中执行。 'persA + persB'等同于'persA.operator +(persB);'。再次读你的问题,我有点不好意思告诉你。你的帖子里写着*我完全认为我应该被允许在装载猎枪时清理我的霰弹枪*而我只是给你送了一把霰弹枪。 – kfsone

回答

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

运算符重载可以是会员还是非会员,它是你的选择。 Se this link有关在成员和非成员运算符重载之间进行选择的准则的更多信息。

注意:通常的做法是将类的成员变量声明为private而不公开实现。然而,这将导致非成员操作员超载,无法再访问对象的成员。解决方案(和常规做法)是将非成员操作员函数添加为friendPerson。然后非会员功能将有权访问私人会员age

class Person { 
friend Person operator+ (const Person&, const Person&); 
private: 
    int age; 
    // ... 
public: 
    // ... 
} 
+1

哦,在'常量'蚂蚁月亮,你为什么这么操作? – Yakk

+0

如果你不这样做 - >只是做年龄+ other.age,会发生同样的事情? – FrostyStraw

+0

@Yakk我把它遗漏了,因为函数声明行会因为'const'关键字而变得太长:)好吧,fair'sfair,我会纠正它。 – Snps

0

看起来像你正试图同时做两种操作符重载方法,而你只需要做一个。

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

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

在这种情况下,相互之间没有任何特别的优势。

0

Person,执行Person& operator+=(Person const& other),增加Person由另一个。

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

而鲍勃是你的叔叔。