+运算符重载以添加不同的C ++类对象

时间:2015-03-22 18:09:15

标签: c++ operator-overloading

我见过许多添加相同类对象的例子。我试图使用运算符重载添加两个不同的类对象。 代码:

#include<iostream>
using namespace std;
class B;
class A
{
public:
int x;
A(int t=99)
{
x=t;
}
friend const A operator+( A& m, B& n);
friend ostream& operator<<(ostream& os, const A& c);
};

const A operator+(A& c1,B& c2) 
{
     A temp;
     temp.x = c1.x + c2.y; 
         return temp;
 }
 ostream& operator<<(ostream &os, const A& c)
 { 
    os << c.x;
    return os;
}


class B
{
public:
int y;
B(int e=90)
{
y=e;
}
friend const A operator+( A& m, B& n);
};

int main()
{
A a,u;
B b;
u=a+b;
cout<<"Value of A+B"<<u;
return 0;
}   

当我编译我的代码时,它显示错误:

$ g ++ operator_overloading.cpp

operator_overloading.cpp:在函数'const A operator +(A&amp;,B&amp;)'中:

operator_overloading.cpp:19:21:错误:无效使用不完整类型'struct B'

operator_overloading.cpp:3:7:错误:'struct B'的前向声明

我做错了什么?

4 个答案:

答案 0 :(得分:2)

您必须在B类定义后定义运算符。 例如

#include<iostream>
using namespace std;

class B;
class A
{
public:
int x;
A(int t=99)
{
x=t;
}
friend const A operator+( const A& m, const B& n);
friend ostream& operator<<(ostream& os, const A& c);
};

 ostream& operator<<(ostream &os, const A& c)
 { 
    os << c.x;
    return os;
}


class B
{
public:
int y;
B(int e=90)
{
y=e;
}
friend const A operator+( const A& m, const B& n);
};

const A operator+(const A& c1, const B& c2) 
{
     A temp;
     temp.x = c1.x + c2.y; 
         return temp;
 }

 //...

否则编译器不知道B类的成员数据。 最好将运算符的paraneters定义为常量引用。在这种情况下,操作员可以处理临时对象。

答案 1 :(得分:1)

错误消息是由于您在定义B类之前定义了const A operator+(A& c1,B& c2)这一事实。

此时B仍然是一个不完整的类型(意味着你只能使用指针和对它的引用,但没有别的)。

在您定义B.

之后移动此定义

答案 2 :(得分:1)

错误很明显。您曾尝试仅使用前向声明来使用B的成员。

答案 3 :(得分:0)

class B;转发声明B。这告诉编译器存在一个名为“B”的类,但没有别的。当您尝试使用c2.y c2B时,编译器还不知道B甚至有y成员。

在这种情况下,一个解决方案是移动B的定义,使其出现在operator+定义之前:

class B;
class A
{
public:
int x;
A(int t=99)
{
x=t;
}
friend const A operator+( A& m, B& n);
friend ostream& operator<<(ostream& os, const A& c);
};

class B
{
public:
int y;
B(int e=90)
{
y=e;
}
friend const A operator+( A& m, B& n);
};

const A operator+(A& c1,B& c2) 
{
     A temp;
     temp.x = c1.x + c2.y; 
         return temp;
 }