-2

试图operator>>用于我的班级飞机,我的main(). 它说

"no operator ">>" matches these operands    Air.
operand types are: std::istream >> Aircraft *"

我的主要():

int main()
{
    Aircraft* air[2];
    int choice;
    std::cout << "Plane '1' and Helicopter '2'" << std::endl;
    std::cin >> choice; 
    if (choice == 1)
    {
        Plane p;
        air[0] = new Plane;
        std::cin >> air[0]; //HERE IS AN ERROR
        air[0]->ShowTabl();
        std::cout << air[0];
    }
    /*if (choice == 2)
    {
        //air[1] = new Helicopter;
        //TODO: << and >>  
    }*/
    system("pause");
    return 0;
}

我的阅读():

std::istream& Aircraft::read(std::istream& frFile)
{
    std::cout << "Name: ";
    frFile >> Name;
    std::cout << "Weight: ";
    frFile >> weight;
    return frFile;
}

运营商>>

它在(.h)中:

朋友 std::istream& 运算符>> (std::istream& is, Aircraft& A);

它在(.cpp)中:

std::istream& operator >> (std::istream& is,  Aircraft& A)
{   
    return A.read(is);
}

至于以某种方式使用,像这样,它是完美的:

Plane p;
    air[0] = new Plane;
    std::cin >> p; // it's okay

我做错了什么?

4

1 回答 1

-1

在整个答案中,我假设两者都Helicopter公开Plane继承自Aircraft. 如果他们不这样做,解释仍然是正确的,但其余的建议可能是错误的。

线

Aircraft* air[2];

声明air为两个指向Aircraft.¹ 的指针的数组。尽管有其他一些评论,您可能确实需要指针,因为您似乎正在使用继承,因此您不能直接使用Aircraft。到目前为止,您只有其中一个,所以我不太确定您是否需要一个数组,但这可能在以后有用。

因为aircontains 指向Aircraft而不是直接包含的指针Aircraft,所以您需要在额外的间接级别处理指向的对象。您的流提取运算符 ( operator>>) 是用于 an Aircraft,而不是用于 an Aircraft*,因此如果您想将它与Plane您在main函数第 10 行分配的 一起使用,您需要将其提取到指向的Aircraft,*air[0]而不是指针 , air[0]

我不确定该Aircraft::read方法在不工作时的效果如何virtual(我希望您还想读入一个Plane特定的属性wingspan,如是明智的。

¹您可以通过从变量名向外读取类型来看到这一点,从右到左。因此,您会看到air,向右看[2]意思是“两个数组”,然后*是“指向”的意思,然后是Aircraft。当你有更复杂的类型时,了解这条规则会很有帮助,比如接受数组的函数。

于 2017-03-29T15:36:44.780 回答