重载运算符错误>>

时间:2017-03-29 14:49:14

标签: c++ inheritance raw-pointer

尝试将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&amp;运营商GT;&GT; (std :: istream&amp; is,Aircraft&amp; 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

我该怎么办?

1 个答案:

答案 0 :(得分:-1)

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

该行

Aircraft* air[2];

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

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

我不确定Aircraft::read方法在virtual时是否有效(我希望你也想在Plane特定属性中读取wingspan),但也许你计划在这部分工作后再实施,这是明智的。

¹您可以通过向外读取变量名称中的类型,向左前方右侧看到此内容。因此,您看到air,向右看[2]表示“数组为2”,然后是*表示“指向”,后跟Aircraft。当你有更复杂的类型时,了解这个规则会有很大的帮助,比如接受数组的函数。