重载运算符出错>>
Error with overload operator>>
尝试将 operator>>
用于我的 class 飞机,但我的 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):
friend std::istream& operator>> (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
我做错了什么?
在整个回答中,我假设 Helicopter
和 Plane
都公开继承自 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
-specific 属性 类似于 wingspan
),但也许您打算在这部分正常工作后实施它,这是明智的。
¹ 您可以通过从变量名向外读取类型,从右到左来查看。因此,你看到 air
,向右看到 [2]
表示“两个数组”,然后是 *
表示“指向的指针”,然后是 Aircraft
。当你有更复杂的类型时,了解这个规则会有很大帮助,比如接受数组的函数。
尝试将 operator>>
用于我的 class 飞机,但我的 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):
friend std::istream& operator>> (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
我做错了什么?
在整个回答中,我假设 Helicopter
和 Plane
都公开继承自 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
-specific 属性 类似于 wingspan
),但也许您打算在这部分正常工作后实施它,这是明智的。
¹ 您可以通过从变量名向外读取类型,从右到左来查看。因此,你看到 air
,向右看到 [2]
表示“两个数组”,然后是 *
表示“指向的指针”,然后是 Aircraft
。当你有更复杂的类型时,了解这个规则会有很大帮助,比如接受数组的函数。