2014-07-25 62 views
1

所以我讀了約Plain Old Data classes (POD),並決定讓我的結構POD保存數據。例如,我有C++爲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 ,,但不知道如何開始..

對不起,如果問題有點不清楚。

+0

這個問題對我來說真的沒有意義 - 爲什麼你不知道成員的名字?你知道類型,所以你知道它的成員。畢竟,每個成員都是不同的類型。 –

+0

@ user2436815'char [8] Name;'是無效的C或C++。這是java或c#-ism!同時請用精確的標籤標記問題,因爲當你使用任何一種語言編程時,C和C++都是非常不同的語言。 – legends2k

+0

你的結構是否有任何理由必須是POD? –

回答

0

您可以使用集合初始化:

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

有遍歷結構或類的成員沒有通用的方法。有一些技巧可以添加數據和函數來模擬這種事情,但除了聲明類型之外,它們都需要額外的設置工作。

0

由於MyClass是一個聚合,你可以使用大括號初始化初始化所有領域的一個電話,不點名任何人:

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

然而,鑑於你的描述,也許POD是不是好主意,你可能想要設計一個帶有訪問器的類來根據(例如)索引列設置內部字段。

+1

很確定'Name'應該是一個C風格的字符串。 –

+1

是的,編輯 – quantdev

0

也許boost::fusion可以幫助你想要存檔。
您可以使用adapt宏遍歷一個結構體。 從提升的例子:

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; 
} 
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; 
} 

這只是我想出的一個簡單例子,你可以弄清楚如何使它「整潔」。請注意,在上面,你也可以迭代訪問目標,通過使用「Trap」中的數組而不是i1,i2,正如我上面所做的那樣。

讓我重申一下,我不推薦這種風格,但如果你絕對必須這樣做,這是一個你可以探索的選項。