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)

分配没有中间访问说明符的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。由访问说明符分隔的非静态数据成员的分配顺序未指定 (11.1)。

简单地说,不要在你的聚合序列之间放置public//访问说明符protectedprivate你会得到这样的保证。

于 2013-03-21T09:45:35.627 回答
0

因此,您只想复制结构中 Parent 部分的成员。如果是,为什么不在 func3() 中实现呢?

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 回答
0

正如您自己所说,它不是 C++03 中的 POD。其中一部分是(Parent1 和 Parent2),但您希望将其余部分视为 POD。好吧,把剩下的变成 POD。通过定义本地结构

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

或通过从第三个结构继承:

struct InternalPod
{
   char z;
   short w;
};

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