Ошибка с оператором перегрузки & gt; & gt;

Пытаясь использовать 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

Что я делаю не так с этим?

-2

Решение

В этом ответе я предполагаю, что оба 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, Знание этого правила очень помогает, когда у вас есть более сложные типы, такие как функции, которые принимают массивы.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]