1

何百ものデータ構造体を含むCヘッダーファイルがあります。各データ構造体が継承するスーパークラスを作成したいと思います。どうやってするか?ヘッダーファイルを解析する必要がありますか?反射?

各Cデータ構造体はパブリッククラスであるため、スーパークラスを作成するだけで...それではどうしますか?手動で明示的にすべての構造体をスーパークラスから継承させるべきではありませんか?

4

4 に答える 4

2

特定のユース ケースでは、C コードをそのままにして、C コードを活用して C++ で必要なソリューションを作成します。たとえば、 および C 構造体の 1 つを格納し、その特定の型のシリアル化を実装する各派生型を含むインターフェイスを定義するベースを使用して、並列階層を作成できserialize()ますdeserialize()

serializeC 構造体ごとに定義されたテンプレート化された/関数を提供することにより、これを完全に外部から取り組むこともできdeserializeます...継承は、C++ の最も頻繁に悪用される機能の 1 つです。

最善の解決策は、コードをどのように使用するかによって異なりますが、C コードを書き直す (つまり、C ヘッダーを C++ ソリューションに書き直すエディターをスクリプト化する) ことは避けたいと思います。 C 側に拡張する必要がある場合は、2 つの別個のブランチを維持する必要があります。

于 2012-07-09T16:32:06.257 に答える
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);
}
于 2012-07-09T16:33:49.697 に答える
1

C / C ++には反映がなく、C ++の他のクラスの基本クラスも1つもないため、これは簡単な作業ではありません。提案したように、スーパークラスから継承するすべてのクラスを手動で作成することも、基本クラスを作成してから、データ構造ごとに新しい構造を作成することもできます。これにより、具体的なデータ構造と基本クラスが継承されます。たとえば、 http //liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527またはhttp://liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527。 各構造体を手動でCヘッダーファイルの基本クラスから継承させる方が効率的だと思います。

于 2012-07-09T16:12:30.713 に答える
1

継承を使用した構造体について聞いたことがありません-どこかで標準的な慣行かもしれませんが、継承のすべての例はクラスを使用しています-構造体をクラスに変更するのは困難ですか? 構造体を見ると「C」と考える傾向があるため、これは混乱を招く可能性があります。

また、継承を使用しても、まだ何百もの構造体またはクラスが必要だと確信していますか? 本当に重複データがない場合は問題ありませんが、重複フィールドがある場合は、相互に継承して重複フィールドを削除することをお勧めします。

于 2012-07-09T16:19:57.547 に答える