C++;-重载接受抽象类的运算符 当我试图解决我的C++类的一个简单问题时,我遇到了一些麻烦。

C++;-重载接受抽象类的运算符 当我试图解决我的C++类的一个简单问题时,我遇到了一些麻烦。,c++,operator-overloading,abstract-class,C++,Operator Overloading,Abstract Class,我有两个类:Component,一个抽象类,我从中继承其他类;还有List,一个包含组件列表的类(它不是模板类)。我想重载操作符+。因此,当我“添加”两个组件时,它将返回一个包含这两个组件的列表 我已使用此选项完成此操作,但未显示任何错误: friend List operator +(Component &c1, Component &c2) { List l; l.push(c1); l.push(c2); re

我有两个类:
Component
,一个抽象类,我从中继承其他类;还有
List
,一个包含组件列表的类(它不是模板类)。我想重载
操作符+
。因此,当我“添加”两个组件时,它将返回一个包含这两个组件的
列表

我已使用此选项完成此操作,但未显示任何错误:

friend List operator +(Component &c1, Component &c2) {
        List l;
        l.push(c1);
        l.push(c2);
        return l;
    }
但是,当我尝试“添加”从组件继承的类的两个对象时,会出现以下错误:

no match for 'operator+' in 'c1 + c2'
以下是我添加对象的方式:

Inherited1 c1(1, 2, 3);
Inherited2 c2(1, 3.2, 10);
List l1 = c1+c2;

友元函数未在类外定义,因此编译器无法找到运算符+。friend func运算符+应在List类之外定义

由于您尚未发布完整的类结构,我假设并尝试了以下方法:

#include <iostream>
#include <list>

using namespace std;


class Component{

    public:


};

class List{

    list<Component> l;
public:

   void push(Component& c)
   {
       l.push_back(c);
   }
  friend List operator +(Component &c1, Component &c2);

};

class Inherited1:public Component{

    public:
    Inherited1(int x,int y,int z){}

};

class Inherited2:public Component{

    public:
     Inherited2(int x,int y,int z){}  


};

 List operator +(Component &c1, Component &c2) {
        List l;
        l.push(c1);
        l.push(c2);
        cout<<"called"<<endl;
        return l;
    }



int main()
{

    Inherited1 c1(1, 2, 3);
    Inherited2 c2(1, 3.2, 10);
    List l1 = c1 + c2;

    return 0;
}
#包括
#包括
使用名称空间std;
类组件{
公众:
};
班级名单{
清单l;
公众:
无效推送(部件和c)
{
l、 推回(c);
}
好友列表运算符+(组件和c1、组件和c2);
};
类Inherited1:公共组件{
公众:
Inherited1(intx,inty,intz){}
};
类Inherited2:公共组件{
公众:
Inherited2(intx,inty,intz){}
};
列出操作员+(组件和c1、组件和c2){
清单l;
l、 推动(c1);
l、 推(c2);

cout和它基本上就是你所展示的。这里肯定有一个不可再现的问题。这是一个坏主意。除非你真正实现了DSL,否则你应该保留运算符的算术含义。
运算符+
使用
组件&
,你发送的是
继承的
,它将如何工作?@RakibulHasan,因为它是一个派生类。你需要在类外添加函数定义。你到底在说什么?为什么:@LightnessRacesinOrbit我用一些文本添加了我真正的意思。
class List{

    list<Component> l;
public:

   void push(Component& c)
   {
       l.push_back(c);
   }
  friend  List operator +(Component &c1, Component &c2) {
        List l;
        l.push(c1);
        l.push(c2);
        cout<<"called"<<endl;
        return l;
    }

};