3

奇妙な質問のほんの少しの背景: 私はネットワーク フレームワーク (RTI DDS) を持っています。これには、ポインターを取り、C 構造体を文字列に変換する C シリアル化関数があります。

また、C++ クラスでも使用できます (動作するように設計されています)。しかし、仮想関数を追加して C++ クラスをポリモーフィックにすると、このシリアル化関数によってセグメンテーション違反が発生するか、さらに悪い場合には間違った出力が提供されます。

構造体のメモリ レイアウトについて内部的に仮定していると思います。

ポリモーフィック C++ オブジェクトから生の C ポインタを取得することは可能ですか?

すべての構造体を 2 回 (1 回はポリモーフィック、もう 1 回は非ポリモーフィック) 作成するだけでよいことはわかっていますが、これは途方もない量のグルー コードにつながります。

現在、私はアイデアがありません。

いくつかの技術的背景: C 関数は RTI DDS ソース パッケージにあります。

DynamicData.c DDS_ReturnCode_t DDS_DynamicData_to_cdr_buffer(...) { ..

4

2 に答える 2

4

structデータのみを含む非仮想ベースを追加できます。

struct DataXYBase {
    int data1;
    double data2;
};

class VirtualBaseClass : public DataXYBase {
    virtual void Function1();
};

class DerivedClass : public VirtualBaseClass {
    virtual void Function1();
};

DataXYBase次に、シリアル化関数に渡す前にキャストします。

于 2015-09-24T14:28:04.777 に答える
3

すべてのデータを POD 構造体 (おそらく相互に継承できる) にバンドルし、データ構造体をメンバーとして (または継承によっても) 含むポリモーフィック クラスにすべてのアクセサー/ロジックをバンドルする必要があると思います。データ部分のみをシリアル化し、データ構造からポリモーフィック クラスに簡単なコンストラクタを提供します。

これにより、必要な接着剤の量が制限され、コード内で目的のポリモーフィズムが保持されます。

于 2015-09-24T14:27:15.633 に答える