2017-03-29 14 views
-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 &は、航空機& 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 

が、私はこれで間違って何をしますか?

+2

コンパイラはポインタを与えていると言っています。オーバーロードでは参照が必要です。 – chris

+2

あなたは '飛行機'に*ポインタ*の配列を宣言しています。あなたは本当にポインタを使用する必要がありますか? –

+0

@ThomasMatthewsこれは相続関連の問題であると考えているので、私はそれを期待しています。配列が 'Aircraft *'の配列であることを確認しますが、 'Plane *'や(コメントを外すと) 'Helicopter *'を含むことができます。私の答えで言ったように、私は配列の必要性についてはあまり確かではありません。 –

答えて

-1

この回答では、HelicopterPlaneの両方がAircraftから公に継承されているとします。もしそうでなければ、説明は正しいが、残りのアドバイスはおそらく間違っているだろう。

ライン

Aircraft* air[2]; 

Aircraftには2つのポインタの配列としてairを宣言.¹あなたはあなたができるので、継承で作業しているように見えるので、あなたはおそらく、他のコメントのいくつかにもかかわらず、ポインタをしたいですかAircraftを直接使用しないでください。これまでのところあなたは1つしか持っていないので、配列が必要であるかどうかは分かりませんが、それは後で役に立つかもしれません。

airAircraftの代わりに、直接Aircraftを含むへのポインタが含まれているため、あなたは余分な間接レベルで尖った-へのオブジェクトに対処する必要があります。ストリーム抽出演算子(operator>>)はAircraft*ではなく、mainの10行目に割り当てられたPlaneと一緒に使用する場合は、指し示すAircraft*air[0]に抽出する必要がありますポインタの代わりにair[0]を使用します。

それはvirtualないときに、私は(私はあなたにもwingspanようPlane固有のプロパティに読んでもらいたいと思い期待)Aircraft::read方法は仕事ができる方法もわからない、おそらくあなたはそれ以降の実装を計画一度あなたはこの部分が働いていると分かります。

¹変数名から型を外に向かって、左の前に行くことで見ることができます。したがって、airが表示され、右側には[2]の「2の配列」を意味し、*は「ポインタ」を意味し、その後にはAircraftが続きます。このルールを知っていると、配列を受け入れる関数のような、より複雑な型があるときに多くの助けになります。

関連する問題