2

I'm trying to understand the concept of operator overloading by writing some simple, silly tests. I thought this might be useful as this helps me understand C++ better.

Why does this example implementing a concatenation operator of Animal class and std::string not compile? G++ gives me the following error:

extra qualification 'Animal::' on member 'operator+' [-fpermissive]

This is the code:

#include <iostream>
using namespace std;

class Animal {

public:
    string _type;
    string _name;
    string _sound;


    Animal & Animal::operator+(const string & o);
};


Animal & Animal::operator+(const string & o) {
    cout << "plus operator \n";
    this->_name=o;
    return *this;
}


int main( int argc, char ** argv ) {
    Animal a;

    a+"hhh";
    cout<<a._name;
    return 0;
}
4

4 回答 4

4
Animal & Animal::operator+(const string & o);

是无效的。它应该是:

Animal & operator+(const string & o);

此外,您对简单加法运算符的实现会导致对其中一个操作数的修改。对于加法运算符来说,这绝不是一件好事。

例如:

int a, b = 5, c = 3;
a = b + c;

这不会改变任何一个操作数的值;它离开bc保持不变,并返回一个完全不同的实例。

因此,您不应重载加法运算符,而应重载加法赋值复合运算符 ( +=):

Animal & operator+=(const string & o);

当然,更改实现并相应地调用它:

Animal & Animal::operator+=(const string & o) {
    cout << "plus operator \n";
    this->_name=o;
    return *this;
}

和:

a += "hhh";
于 2013-02-02T15:59:54.097 回答
2

类内部的声明operator+不需要限定,正是因为它是在类中声明的:

class Animal {
  // ...
  Animal& operator+(const string& o);
}

当您定义函数时,此限定是必要的,因为您在类之外定义它 - 编译器需要知道该函数属于哪个类。

于 2013-02-02T16:00:10.523 回答
0

原型中不需要Animal::,因为它已经在Animal类中了。只需使用:

Animal & operator+(const string & o);
于 2013-02-02T16:00:09.797 回答
0

Animal::限定应在成员函数的定义使用,而不是在声明中。因此,将您的运营商声明更改为:

Animal & operator+(const string & o);
于 2013-02-02T16:00:39.213 回答