C++ 过载运算符出错>&燃气轮机;
试图对我的类平面使用C++ 过载运算符出错>&燃气轮机;,c++,inheritance,raw-pointer,C++,Inheritance,Raw Pointer,试图对我的类平面使用操作符>,我的main()中有一个错误。上面说 "no operator ">>" matches these operands Air. operand types are: std::istream >> Aircraft *" 我的主要观点是: 至于使用的方式,像这样,所以它是完美的: Plane p; air[0] = new Plane; std::cin >> p; // it's okay 这有什么不
操作符>
,我的main()
中有一个错误。上面说
"no operator ">>" matches these operands Air.
operand types are: std::istream >> Aircraft *"
我的主要观点是:
至于使用的方式,像这样,所以它是完美的:
Plane p;
air[0] = new Plane;
std::cin >> p; // it's okay
这有什么不对?在整个回答中,我假设
直升机和飞机都是从飞机
公开继承的。如果他们不这样做,解释仍然是正确的,但其余的建议可能是错误的
线路
Aircraft* air[2];
将air
声明为指向airpair
的两个指针数组。尽管有其他一些注释,但您可能确实需要这些指针,因为您似乎正在使用继承,因此不能直接使用airpair
。到目前为止,您只有一个阵列,所以我不太确定您是否需要阵列,但这在以后可能会有用
由于air
包含指向飞机的指针,而不是直接包含飞机
,因此需要在额外的间接级别处理指向的对象。您的流提取操作符(operator>
)用于飞机
,而不是飞机*
,因此,如果您想将其用于主功能
第10行分配的飞机
,则需要将其提取到指向的飞机
,*air[0]
,而不是指针,air[0]
我不确定Aircraft::read
方法在非虚拟
(我希望您也希望在飞机
-特定属性(如翼展
)中阅读)的效果如何,但也许您计划在该部件工作后实施该方法,这是明智的
通过向外读取变量名中的类型(在左前向右),可以看到这一点。因此,您可以看到air
,向右看[2]
意思是“两个数组”,后面是*
意思是“指向”,后面是飞机
。当您有更复杂的类型时,了解此规则会有很大帮助,例如接受数组的函数。编译器告诉您正在提供指针,而重载需要引用。您正在声明指向飞机的指针数组。你真的需要使用指针吗?@ThomasMatthews我希望如此,因为这是一个与继承相关的问题。查看阵列如何为飞机*
s,但可以包含飞机*
s或(一旦未注释)直升机*
s。正如我在回答中所说,我不太确定是否需要阵列。为什么对和投反对票?我唯一能想到的是使用C++中的原始指针是个好主意,有人认为“NIKICAX不应该使用它们,但是我在回答中解释我认为它们是必须的,即使它们不是答案,也总比没有解决方案好。哦,这与问题没有直接关系,但是,请确保在if语句中删除new
中的任何指针(为了安全起见,将这两个指针都初始化为nullptr
,然后即使没有相应的new
,也可以delete
),并确保析构函数是虚拟的,以便调用正确的析构函数。
std::istream& operator >> (std::istream& is, Aircraft& A)
{
return A.read(is);
}
Plane p;
air[0] = new Plane;
std::cin >> p; // it's okay
Aircraft* air[2];