何百ものデータ構造体を含むCヘッダーファイルがあります。各データ構造体が継承するスーパークラスを作成したいと思います。どうやってするか?ヘッダーファイルを解析する必要がありますか?反射?
各Cデータ構造体はパブリッククラスであるため、スーパークラスを作成するだけで...それではどうしますか?手動で明示的にすべての構造体をスーパークラスから継承させるべきではありませんか?
何百ものデータ構造体を含むCヘッダーファイルがあります。各データ構造体が継承するスーパークラスを作成したいと思います。どうやってするか?ヘッダーファイルを解析する必要がありますか?反射?
各Cデータ構造体はパブリッククラスであるため、スーパークラスを作成するだけで...それではどうしますか?手動で明示的にすべての構造体をスーパークラスから継承させるべきではありませんか?
特定のユース ケースでは、C コードをそのままにして、C コードを活用して C++ で必要なソリューションを作成します。たとえば、 および C 構造体の 1 つを格納し、その特定の型のシリアル化を実装する各派生型を含むインターフェイスを定義するベースを使用して、並列階層を作成できserialize()
ますdeserialize()
。
serialize
C 構造体ごとに定義されたテンプレート化された/関数を提供することにより、これを完全に外部から取り組むこともできdeserialize
ます...継承は、C++ の最も頻繁に悪用される機能の 1 つです。
最善の解決策は、コードをどのように使用するかによって異なりますが、C コードを書き直す (つまり、C ヘッダーを C++ ソリューションに書き直すエディターをスクリプト化する) ことは避けたいと思います。 C 側に拡張する必要がある場合は、2 つの別個のブランチを維持する必要があります。
たくさんの構造体がある場合:
明白な答えは、検索と置換を巧みに利用して、それらを新しい基本クラスから継承させることです。構造体のメンバーにアクセスすることはできませんが、それらすべてへのポインターをコンテナーに格納することはできます
struct base {
int dostuff() const {std::cout << "thing";}
};
struct thing1 : public base {
int size;
};
//otherstructs inheriting from base
int main() {
std::vector<std::unique_ptr<base>> objects;
objects.push_back(std::unique_ptr<base>(new thing1()));
objects[1].dostuff();
}
基本クラスを作成するのが難しすぎる場合は、代わりにラッパークラスを介して関数を追加してみてください。これらへのポインターをコンテナーに格納することはできませんが、構造体に同様のメンバーがある限り、メンバーにアクセスできます。
struct thing1 {
int size;
};
//other unchanged structs
template<class mystruct>
struct wrapper : mystruct {
int getsize() {return mystruct.size;}
};
int main() {
wrapper<thing1> mything1;
std::cout << mything1.size << mything1.getsize();
}
または、メソッドを追加するだけの場合は、それらを別の関数にします。
struct thing1 {
int size;
};
//other unchanged structs
template<class T>
int getsize(const T& obj) {return obj.size;}
int main() {
thing1 mything1;
std::cout << mything1.size << getsize(mything1);
}
C / C ++には反映がなく、C ++の他のクラスの基本クラスも1つもないため、これは簡単な作業ではありません。提案したように、スーパークラスから継承するすべてのクラスを手動で作成することも、基本クラスを作成してから、データ構造ごとに新しい構造を作成することもできます。これにより、具体的なデータ構造と基本クラスが継承されます。たとえば、 http : //liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527またはhttp://liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527。
各構造体を手動でCヘッダーファイルの基本クラスから継承させる方が効率的だと思います。
継承を使用した構造体について聞いたことがありません-どこかで標準的な慣行かもしれませんが、継承のすべての例はクラスを使用しています-構造体をクラスに変更するのは困難ですか? 構造体を見ると「C」と考える傾向があるため、これは混乱を招く可能性があります。
また、継承を使用しても、まだ何百もの構造体またはクラスが必要だと確信していますか? 本当に重複データがない場合は問題ありませんが、重複フィールドがある場合は、相互に継承して重複フィールドを削除することをお勧めします。