Пытаясь использовать 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& есть, самолеты& А);
это в (.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*
так что если вы хотите использовать его с Plane
Вы разместили в строке 10 вашего main
функция, вам нужно извлечь его в Aircraft
, *air[0]
вместо указателя, air[0]
,
Я не уверен, насколько хорошо Aircraft::read
метод может работать, когда это не так virtual
(Я ожидаю, что вы также хотите прочитать в Plane
-специфическое свойство как wingspan
), но, возможно, вы планируете реализовать это позже, когда у вас будет работать эта часть, что разумно.
¹ Это можно увидеть, прочитав тип из имени переменной наружу, пройдя вправо перед левым. Таким образом, вы видите air
, идите направо, чтобы увидеть [2]
что означает «массив из двух», а затем *
значение «указатель на», сопровождаемый Aircraft
, Знание этого правила очень помогает, когда у вас есть более сложные типы, такие как функции, которые принимают массивы.
Других решений пока нет …