【问题标题】:+ operator overload to add different C++ class object+ 运算符重载以添加不同的 C++ 类对象
【发布时间】:2015-03-22 18:09:14
【问题描述】:

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

#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&, B&)'中:

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

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

我做错了什么??

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

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

    【讨论】:

    • 我一直认为“error: forward declaration of ...”是一个名字奇怪的错误信息。我记得当我开始学习 C++ 时,它给我的印象是前向声明本身就是一个错误。我能理解这可能会让人们感到困惑。
    • @ChristianHackl:这不是错误消息。它是错误消息的第二行,以“invalid use of ...”开头,只是告诉您有关错误的更多上下文信息。它已被分解到自己的行中,以便可以以常规方式报告文件名和行号。诚然,GCC 以一种使它看起来像第二条错误消息的方式呈现它,但事实并非如此。
    【解决方案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 有哪些数据成员。 此外,最好将运算符的参数定义为常量引用。在这种情况下,操作员可以处理临时对象。

    【讨论】:

      【解决方案3】:

      错误消息是因为您在定义 B 类之前定义了 const A operator+(A&amp; c1,B&amp; c2)

      此时 B 因此仍然是一个不完整的类型(这意味着您只能使用指向它的指针和引用,但不能使用其他任何东西)。

      在定义 B 之后移动这个定义。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多