2017-04-19 11 views
0

私はこのウェブサイトを初めてご利用になり、プログラミングに少し新しくなりました。私は初めてベクトルを使用していますが、その内容を印刷したいのですが、通常の単語の代わりにアドレスを取得しています。私はこれ以外の方法でこれを行う方法を知らない。印刷用Coutベクタアドレス

vector<Component*> vect; 

と私のコード:

マイベクトル

void Frame::print() { 
    for (int i = 0; i < vect.size(); i++) 
     cout << vect[i] << endl; 
} 
+0

あなたのベクトルはあなたのクラスのポインタを格納するので、印刷する前に間接参照する必要があります。 – florgeng

+0

本当にそれがベクターと何か関係があると思うなら、それを使わずに何か変更があるかどうか確認してみてください。 – juanchopanza

+0

どのように私はその逆参照を行うのですか? – hypr2

答えて

2

あなたは、ベクター内のポインタを格納しています。ポインタの値はメモリアドレスなので、出力にアドレスが表示されています。あなたが実際Componentオブジェクトにアクセスするためのポインタを間接参照する必要があります。これが機能するためには

void Frame::print() 
{ 
    for (int i = 0; i < vect.size(); i++) 
    { 
     Component *component = vect[i]; 
     cout << *component << endl; // <-- not the extra '*' 
    } 
} 

を、Componentためoperator<<過負荷も必要とされています

ostream& operator<<(ostream &out, const Component &comp) 
{ 
    // print comp values to out as needed... 
    return out; 
} 

推奨読書:

Operator overloading

また、ポインタと参照をgエナメル

+0

新しいマイナーナグ:ここで読者を指します:http://stackoverflow.com/questions/4421706/operator-overloading神Googleの検索で間違って偶然見つけられる可能性があることを知っている。 – user4581301

1

vectは、コンパイラがコンポーネントクラスオブジェクトとして扱うメモリの他のチャンクのアドレスを持つメモリチャンクであるComponent *(別名コンポーネントポインタ)のベクトル(別名、連続ストレージの塊)です。これらのアドレスをcoutで印刷すると、無意味な数字の大きなリストが表示されます。

あなたがしたいと思うものは、おそらくコンポーネントポインターのベクトルを保存せず、単にコンポーネントのベクトルを保存するだけです。あなたが何をしているのか正確に分かっていない限り、最近ではC++で頭が痛いです。あなたが本当にポインタを必要とするなら、std :: unique_ptrとstd :: make_uniqueのベクトルを使うべきです。

コンポーネントのアドレスではなくむしろコンポーネントを印刷しようとすると、Component用に< <演算子が存在しないことがよくわかります。あなたは1つ書く必要があります。何かのように

std::ostream& operator<<(std::ostream &stream, const Component&component) 
{ 
    stream << component.string_member; 
    return stream; 
} 
+0

誰が悩んでいるのですか?キャッシュミスと建設時間? –

+0

ええと私がコミットした直後に知っていたのは、オペレータの過負荷を台無しにしてしまいました。 –

+0

RAWポインタを使用することに悩まされている主な理由は、RAIIを無視することです。つまり、newとdeleteの間のすべてのコード行がスタックを巻き戻さないことが分かっていなければ漏れは避けられません。 –