🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1279閲覧

[C++] Vectorの要素をイテレータを用いて出力する方法

amber_snob

総合スコア30

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/30 07:22

編集2019/09/30 07:25

C++でvectorを扱っているプログラムの問題を解いています。

vecはvectorの要素をクラスWrapperへのポインタとしています。
main()でイテレータを使ってvecの先頭要素vec.begin()から順にWrapperクラスのprint関数を使って要素を出力しようとしているのですが実行結果のようにアドレスが表示されてしまいます。
解決方法があれば教えていただきたいです。

ソースコード

c++

1#include <iostream> 2#include <vector> 3 4using namespace std; 5 6class Wrapper { 7public: 8 Wrapper() { 9 } 10 virtual void print() const { 11 } 12}; 13 14class IntWrapper: public Wrapper { 15private: 16 // BEGIN 17 int value; 18 // END 19public: 20 IntWrapper(int intValue) { 21 // BEGIN 22 this->value = intValue; 23 // END 24 } 25 // BEGIN 26 void print() const { 27 cout << this->value << endl; 28 } 29 // END 30}; 31 32class CharWrapper: public Wrapper { 33private: 34 // BEGIN 35 char value; 36 // END 37public: 38 CharWrapper(int charValue) { 39 // BEGIN 40 this->value = charValue; 41 // END 42 } 43 // BEGIN 44 void print() const { 45 cout << this->value << endl; 46 } 47 // END 48}; 49 50int main() { 51 vector<Wrapper*> vec; 52 vec.push_back(new IntWrapper(1)); 53 vec.push_back(new CharWrapper('A')); 54 vec.push_back(new CharWrapper('x')); 55 vec.push_back(new IntWrapper(-234)); 56 // BEGIN 57 for (vector<Wrapper*>::iterator it = vec.begin(); it != vec.end(); ++it) 58 { 59 cout << *it << "\n"; //アドレスが表示される。 60 } 61 // END 62 // deleteは省略 63 return 0; 64}

実行結果

0xe027d0 0xe027d8 0xe027e0 0xe027e8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

cout << *it << "\n"; //アドレスが表示される。

(*it)->print();

こう書きたかったのかな?と思いました。

投稿2019/09/30 07:37

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amber_snob

2019/09/30 08:01

takabosoftさん回答ありがとうございます! (*it)->print()という書き方でうまくいきました! *itは()でくくる必要があったみたいですね????
guest

0

iterator自体がポインタと同じように使えるように、*演算子でイテレーターが指すものを取得する、というようになっています。

vector<Wrapper*>::iterator it;からWrapperを参照したい場合、**itのように、イテレーター→ポインタ→実体と2回の参照が必要です。

投稿2019/09/30 07:32

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問