2012-05-12 70 views
1
#ifndef ASSETS_H_INCLUDED 
#define ASSETS_H_INCLUDED 
#include <vector> 
#include string.h> 

const int ID_Max = 100; 
typedef char ID[ID_Max]; 

struct node; 

struct people{ 
std::vector<ID> T_ID; 
std::vector<node*> Nodes; 
people(ID t, node* person){ 
    T_ID.push_back(t); 
    Nodes.push_back(person); 
} 
people(){} 
}; 

struct node { 
ID T_ID; 
node* Parent; 
people* leftChildren; 
node* rightChild; 
node(ID t, node* p, node* l, node* r) :I_ID(t), Parent(p), rightChild(r) 
{leftChildren = new people(); } 
}; 

#endif // ASSETS_H_INCLUDED 

我的問題是這是它解釋ID作爲字符指針,當我希望people :: people(char [ID_Max],node *)與節點相同時。如果你有建議,將非常感激。字符數組解釋爲char指針在構造函數中的幫助

+5

爲什麼不使用'std :: string'而不是'char [100]'? – hmjd

+0

我用於我的項目的比較方法是memcmp,所以我想設置基本大小 – thealbinosmurf

+0

...所以下一個顯而易見的問題是爲什麼您使用'memcmp'來比較兩個字符串值? –

回答

2

如果你寫一個數組類型的函數簽名,它就像使用指針一樣,這樣的:

void f(char p[]); 

是一樣的:

void f(char *p); 

這看起來好像是你的問題的根源在這裏。你可能會更好,例如一個std::array<char,ID_Max>(在C++ 11中)或一個std::vector<char>(在C++ 98中)。然後你可以使用&cont[0]得到一個指向它包含的連續內存開始的指針。作爲一個次要的黑客,我似乎記得,對於vector的內存在C++ 98中並不嚴格保證是連續的,但它在實踐中始終是連續的(你可以依靠它)。措辭在C++ 03中得到了修復。

+0

向量一直保證,它是保證被C++ 11添加的字符串。 – stefaanv

+0

@stefaanv:http://herbsutter.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/(特別是他所說的「鄰接實際上是矢量的一部分的位事實上,如果發現C++ 98標準並不能完全保證連續性,那麼C++ 03標準就被修改爲明確地加上保證,這一點非常重要。「) –

+1

我正在糾正。我誤解了你的答案,我以爲你說過「用C++ 11修正」 – stefaanv