C++での子クラスオブジェクトのインスタンス生成方法について
Posted: 2017年5月11日(木) 17:56
現在、親クラスAを型に指定しているshared_ptr型のvector配列に親クラスAの子クラスのインスタンスを格納するという関数の作成を目指しています。
関数の具体的な処理ですが、string型の第一引数type、shared_ptr<A>の二次引数objをそれぞれ持ち、
String型の実引数をtypeにて仮引数として呼び出し、if文にてクラスAに格納する子クラスB~Eを選択するというものです。
現在、以下のコード形式にて実装しようとしました。処理内容は例です。
上記のコードの内容で実行したところ、配列arrayに格納された変数はすべてが親クラスAの型を持つものになってしまい、関数Init()で渡された変数も格納されずじまいとなってしまいました。
上記のコードの方法で間違いの点や、vector配列に同じ親クラスの別の子クラスのインスタンスを代入する処理の実装方法について教えて頂ければ幸いです。
使用環境はWindows8.1、VisualStudio2015です。また、作品制作にDXライブラリを使用していますが、上記の処理ではまだ関係しません。
関数の具体的な処理ですが、string型の第一引数type、shared_ptr<A>の二次引数objをそれぞれ持ち、
String型の実引数をtypeにて仮引数として呼び出し、if文にてクラスAに格納する子クラスB~Eを選択するというものです。
現在、以下のコード形式にて実装しようとしました。処理内容は例です。
class Content{
public:
Content(int _num) : num(_num){
};
int num;
}
class A{
public:
A();
~A();
virtual void Init(Content c){
};
}
class B : public A{
public:
B();
~B();
void Init(Content c){
content = c;
};
private:
Content content;
}
//以下、クラスAの子クラスC~Eまで宣言
//処理内容は子クラスBのものと同じ
int main(){
std::vector<std::shared_ptr<A>> array;
std::string _type = <別関数から検索用文字列を取得>;
//略
for(int i = 0;i < 4;i++){
std::shared_ptr<A> temp;
SetInstance(_type, temp);
array.push_back(temp);
array.back()->Init(PanelContent(i));
}
}
//文字列によって参照渡しする子クラスを選択する
void SetInstance(std::string type, std::shared_ptr<A>& obj){
if(type == "TYPE_B"){
obj = std::make_shared<B>(B());
}else if(type == "TYPE_C"){
obj = std::make_shared<C>(C());
}
else if(type == "TYPE_D"){
obj = std::make_shared<D>(D());
}else if(type == "TYPE_E"){
obj = std::make_shared<E>(E());
}
}
上記のコードの内容で実行したところ、配列arrayに格納された変数はすべてが親クラスAの型を持つものになってしまい、関数Init()で渡された変数も格納されずじまいとなってしまいました。
上記のコードの方法で間違いの点や、vector配列に同じ親クラスの別の子クラスのインスタンスを代入する処理の実装方法について教えて頂ければ幸いです。
使用環境はWindows8.1、VisualStudio2015です。また、作品制作にDXライブラリを使用していますが、上記の処理ではまだ関係しません。