C ++将值分配给POD对象

时间:2014-07-25 15:16:11

标签: c++ c memory struct

所以我读到了Plain Old Data classes (POD),并决定让我的结构POD来保存数据。例如,我有

struct MyClass {
    int ID;
    int age;
    double height;
    char[8] Name;
};


显然,要为结构赋值,我可以这样做:

MyClass.ID = 1;
MyClass.age = 20;
...

但是,无论如何都要分配原始数据,而不知道每个字段的名称?

例如,我的程序检索每列的字段值,并且我想将值赋给结构,因为我不知道字段的名称..

MyClass c;

while (MoreColumns()) {
    doSomething( c , GetNextColumn() );    //GetNextColumn() returns some value of POD types
}

我假设有使用memcpy或std :: copy的方法,但不确定如何开始...

对不起,如果问题有点不清楚。

4 个答案:

答案 0 :(得分:0)

您可以使用聚合初始化:

MyClass c1 = { 1, 20, 6.0, "Bob" };
MyClass c2;
c2 = MyClass{ 2, 22, 5.5, "Alice" };

没有通用的方法来循环结构或类的成员。添加数据和函数以模拟这类事情有一些技巧,但除了声明类型之外,它们都需要额外的设置工作。

答案 1 :(得分:0)

由于MyClass是一个聚合,你可以使用一个大括号来初始化一个调用中的所有字段,而无需命名任何字段:

   MyClass m  { 
       1,
       2,
       42.0,
       { "Joseph" }
   };

但是,根据您的描述,也许POD不是一个好主意,您可能想要设计一个带有访问器的类来根据(例如)索引列设置内部字段。

答案 2 :(得分:0)

也许boost::fusion可以帮助您存档。

struct MyClass 
{
    int ID;
    int age;
    double height;
};

BOOST_FUSION_ADAPT_STRUCT(
    MyClass,
    (int, ID)
    (int, age)
    (double, height)
)

void fillData(int& i)
{
    i = 0;
}

void fillData(double& d)
{
    d = 99;
}

struct MoreColumns
{
    template<typename T>
    void operator()(T& t) const
    {
        fillData(t);
    }
};

int main()
{
    struct MyClass m = { 33, 5, 2.0 };
    std::cout << m.ID << std::endl;
    std::cout << m.age << std::endl;
    std::cout << m.height << std::endl;

    MoreColumns c;
    boost::fusion::for_each(m, c);

    std::cout << m.ID << std::endl;
    std::cout << m.age << std::endl;
    std::cout << m.height << std::endl;
}

答案 3 :(得分:0)

您要实现的目标通常会导致难以阅读甚至无法读取的代码。但是,假设您有一个真正有充分理由尝试(而不是初始化)原始数据分配给字段而不知道其名称,则可以使用reinterpret_cast,如下所示(Link here) 。我不推荐它,但只是想指出你可以选择。

#include <cstdio>
#include <cstring>

struct Target { // This is your "target"
    char foo[8]; 
};

struct Trap { 
    // The "trap" which lets you manipulate your target
    // without addressing its internals directly.
    // Assuming here that an unsigned occupies 4 bytes (not always holds)
    unsigned i1, i2;
};

int main() {
    Target t;
    strcpy(t.foo, "AAAAAAA");

    // Ask the compiler to "reinterpet" Target* as Trap*
    Trap* tr = reinterpret_cast<Trap*>(&t);

    fprintf(stdout, "Before: %s\n", t.foo);
    printf("%x %x\n", tr->i1, tr->i2);

    // Now manipulate as you please
    // Note the byte ordering issue in i2.
    // on another architecture, you might have to use 0x42424200
    tr->i1 = 0x42424242;
    tr->i2 = 0x00424242;

    printf("After: %s\n", t.foo);

    return 0;
} 

这只是我提出的一个简单例子,你可以弄清楚如何制作它&#34; neater&#34;。请注意,在上面,您还可以通过在&#34; Trap&#34;中使用数组来迭代访问目标。而不是像我上面所做的i1,i2。

让我重申一下,我不推荐这种风格,但如果你绝对必须这样做,这是你可以探索的选择。