首页 文章

operator重载添加不同的C类对象

提问于
浏览
0

我已经看到很多例子来添加相同类的对象 . 我试图使用运算符重载添加两个不同的类对象 . 码:

#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: In function ‘const A operator+(A&, B&)’:

operator_overloading.cpp:19:21: error: invalid use of incomplete type ‘struct B’

operator_overloading.cpp:3:7: error: forward declaration of ‘struct B’

我做错了什么?

4 回答

  • 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定义为常量引用 . 在这种情况下,操作员可以处理临时对象 .

  • 0

    错误消息是由您在定义类B之前定义 const A operator+(A& c1,B& c2) 的事实引起的 .

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

    在定义B.之后移动此定义

  • 1

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

  • 1

    该行 class B; forward-declares 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;
     }
    

相关问题