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