c++コンテナは異なる構造のデータを格納する
本来はc++容器に異なる構造体を格納しようとしたが実現せず,最後に子類親類の相互変換により実現した.
ベースクラスを構築するコンテナを直接pushサブクラスにすることで,異なるデータ構造を挿入できるコンテナを実現した.
1、異なる構造体を同じベースクラスから派生したサブクラスとして作成し、サブクラスに自分の希望するデータ型を追加する.
Test.h
2、サブクラスをインスタンス化してvectorにpushする(他の容器でも可)
3、必要に応じてvecでベースクラスに変換したサブクラスを戻す
最終結果:
c1:I am ChildOne;999
c2:I am ChildTwo;ChildTwo Data
4、注意事項
コンテナ内のデータを削除する必要がある場合は、クラスdeleteを手動で削除する必要があります.そうしないと、メモリが漏れます.
ベースクラスを構築するコンテナを直接pushサブクラスにすることで,異なるデータ構造を挿入できるコンテナを実現した.
1、異なる構造体を同じベースクラスから派生したサブクラスとして作成し、サブクラスに自分の希望するデータ型を追加する.
Test.h
class Father
{
public:
std::string flag = "I am Father";
};
class ChildOne :public Father
{
public:
std::string c1_flag = "I am ChildOne";
int c1_data = 999;
};
class ChildTwo :public Father
{
public:
std::string c2_flag = "I am ChildTwo";
std::string c2_data = "ChildTwo Data";
};
2、サブクラスをインスタンス化してvectorにpushする(他の容器でも可)
Father * father = new Father();
cout << "father:" << father->flag << endl;
ChildOne *c1 = new ChildOne();
cout << "childone:" << c1->flag << endl;
ChildTwo *c2 = new ChildTwo();
cout << "childtwo:" << c2->flag << endl;
vector*f_vec = new vector;
f_vec->push_back(c1);
f_vec->push_back(c2);
3、必要に応じてvecでベースクラスに変換したサブクラスを戻す
cout << "c1:" << static_cast(f_vec->at(0))->flag <(f_vec->at(0))->c1_data << endl;
cout << "c2:" << static_cast(f_vec->at(1))->flag <(f_vec->at(1))->c2_data << endl;
最終結果:
c1:I am ChildOne;999
c2:I am ChildTwo;ChildTwo Data
4、注意事項
コンテナ内のデータを削除する必要がある場合は、クラスdeleteを手動で削除する必要があります.そうしないと、メモリが漏れます.