1

多くの質問が POD について語っています。しかし、すべての質問は完全なオブジェクトのコピーについて語っています。クラスの単純な古いデータ部分に同じ概念を適用できますか? 例:

struct Parent1
{
    int x;
    float y;
};

struct Parent2
{
    int k;
    float l;
};

struct NotPod : public Parent1, public Parent2
{
    char z;
    short w;
};

NotPod a, b;

void func()
{
    a.z = '4';
    a.w = 345;
    memcpy((char*)&b.z, (char*)&a.z, (char*)(&a.w)-(&a.z) + sizeof(a.w));
}

古い c++ (C++11 ではない) について質問しています。

4

3 に答える 3

2

サンプル コードからわかるように、質問は POD に関するものではありません。必要なのは、最も派生したクラスのメンバーが集合体であり、連続したメモリ レイアウトを持つという保証です。

9.2.12 (ISO 14882:2003) を参照

access-specifier を介在させずに宣言された (非共用体) クラスの非静的データ メンバーは、後のメンバーがクラス オブジェクト内でより高いアドレスを持つように割り当てられます。アクセス指定子で区切られた非静的データ メンバの割り当て順序は規定されていません (11.1)。

簡単に言えば、 // アクセス指定子を集約のシーケンスの間に置かないでください。そうすれば、そのpublicような保証が得られます。protectedprivate

于 2013-03-21T09:45:35.627 に答える
0

あなたが自分で言ったように、それはC++03のPODではありません。その一部は(Parent1とParent2)ですが、残りをPODとして扱いたいと考えています。さて、残りをPODにします。ローカル構造体を定義することによって

struct NotPod : public Parent1, public Parent2
{
    struct InternalPod
    {
       char z;
       short w;
    };
    InternalPod i; 
};

または、3番目の構造体から継承することによって:

struct InternalPod
{
   char z;
   short w;
};

struct NotPod : public Parent1, public Parent2, public InternalPod
{
};
于 2013-03-21T08:42:37.833 に答える
0

したがって、構造体の親パーツのメンバーのみをコピーする必要があります。はいの場合、なぜ func3() で like を実装しないのですか?

void func2()
{
    a.z = '7';
    a.w = 444;
    a.x = 4;
    a.y = 2.1;
    memcpy(&b, &a, sizeof(NotPod)); // copies all the members
}

void func3()
{  
    a.z = '7';
    a.w = 444;
    a.x = 4;
    a.y = 2.1;
    memcpy(&b, &a, sizeof(Parent)); // copies only the members of the Parent
}
于 2013-03-17T23:37:58.457 に答える