Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 过载运算符出错>&燃气轮机;_C++_Inheritance_Raw Pointer - Fatal编程技术网

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