人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

STLのvectorの使い方について教えてください。
「図クラス」から派生した「丸クラス」「三角クラス」「四角クラス」があるとします。
それらサブクラスは、純粋仮想関数 draw()を実装しています。
それらサブクラスをstd::vectorにpush_backして、イテレータでdraw()を呼び出します。
この時、std::vector<図>と書くのでしょうか? それとも std::vector<図*> と書くのでしょうか?

●質問者: nekomilk
●カテゴリ:コンピュータ
✍キーワード:Draw STD STL Vector イテレータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● luckyII
●25ポイント

http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html

C++入門

ポリモーフィズムを使うならポインタが必要ですから std::vector<図*> でいいんじゃないでしょうかね。

◎質問者からの返答

そのまま入れたかったのですが、やっぱり無理なんですね…。


2 ● mogos
●25ポイント

http://www001.upp.so-net.ne.jp/monpe/2002/cpptext/230_cpp_ed...

404 Not Found

std::vector<図*>と書きます。

std::vector<図>と書いた場合、代入する時点で図にコピーされ、いわば型情報が失われた形になるので、図の関数が呼ばれることになります。(純粋仮想関数なら呼び出しようがないので、コンパイルできないはずです。)

一方std::vector<図*>と書いた場合は、そのポインタから動的に呼ばれる関数が決まるので、実行時にその実クラスの関数が呼ばれます。

ということで、C++でポリモーフィズムを実現する際にはポインタで扱います。

参考までにテストコードをつけておきます。

#include <vector>

#include <iostream>

using namespace std;

class Base{

public:

virtual void draw(){

cout << ”this is Base” << endl;

};

};

class A : public Base{

public:

void draw(){

cout << ”this is A” << endl;

}

};

class B : public Base{

public:

void draw(){

cout << ”this is B” << endl;

}

};

int main(){

vector<Base> vec;

vector<Base*> ptr_vec;

A a;

B b;

vec.push_back(a);

vec.push_back(b);

for(vector<Base>::iterator it = vec.begin();it != vec.end();++it){

it->draw();

}

ptr_vec.push_back(&a);

ptr_vec.push_back(&b);

for(vector<Base*>::iterator it = ptr_vec.begin();it != ptr_vec.end();++it){

(*it)->draw();

}

}

◎質問者からの返答

ありがとうございました♪

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ