2012-08-01 46 views
0

我有以下分組佈局:變量類陣列

struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    char String[StringLen]; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
} 

的類是這樣的:

class ServerInfo 
{ 
    short PacketSize; //Size of the whole packet 
    BYTE TotalServers; //total of PacketLayout structs 
    PacketLayout Server[TotalServers]; 
    int GlobalSecCode; 
    short EncryptedPacketSize; //Same as the first member, just xored 
} 

所以問題我已經是一種製備類內的可變大小的數組或一個結構,其大小取決於指向的最後一位成員BYTE StringLen(用於結構)和BYTE TotalServers(用於類)。

我不知道這是什麼解決方案,也許實現一個模板?,如果這樣我可以看到一個例子(我還不熟悉模板)也想引用我的成員名稱而不計算指針位置由我自己(因爲我現在正在做)。

謝謝。

+0

我不確定你的意思是:*「我想引用我的成員名稱而不用自己計算指針位置」* – Flexo 2012-08-01 19:10:04

+0

標準C++中沒有解決此問題的方法。除非在編譯時知道ServerInfo.TotalServer和PacketLayout.StringLen的值,否則模板不會有所幫助。你只需要自己計算偏移量。 – jahhaj 2012-08-01 19:10:13

+0

Flexo現在我正在計算指針位置由我自己的字符串成員,因爲沒有辦法使其編譯時間。 – ffenix 2012-08-01 19:12:11

回答

2

與模板這樣做是可能的,例如:

template <int StringSize> 
struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    char String[StringSize]; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
}; 

,您可以使用它作爲:

PacketLayout<100> pkt; 

通常你會想要做的是簡單不過。例如,如果你重新排序分組,知道上限大小,你可以簡單地做:

struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
    char String[MAX_POSSIBLE_SIZE]; 
}; 

或者:

struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
    char *String; 
}; 

和分配/讀取過程中設置String

個人而言,雖然我會跳過所有這些凌亂的底層細節,並使用像protobuf這樣的工具爲您完成工作,並讓您自由專注於爲項目增添價值的更重要的高層次事物。

有使用有時過於常見,但骯髒的伎倆:

struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
    char String[1]; 
}; 

在那裏,人們在最後確定的可變部分的大小爲1,然後比所需的結構,使他們可以故意分配更多的內存寫過去的結尾。這是邪惡的,但非常不推薦。

+0

這個班怎麼樣?該類還有一個PacketLayout結構的變量數組,我不知道編譯時PacketLayout的大小。字符串的大小由StringLen成員指向。 – ffenix 2012-08-01 19:15:41

+1

@ffenix你可以使用'std :: string'而不是'char'數組嗎? – juanchopanza 2012-08-01 19:16:28

+0

@ffenix:這是你的問題,除非你知道在編譯時這些大小的模板不會幫你。看看Flexo如何編寫'PacketLayour <100> pkt;',100必須是編譯時間常量。 – jahhaj 2012-08-01 19:17:26

0

使用模板肯定是要走的路:

template <size_t TotalServers> 
class ServerInfo 
{ 
    PacketLayout Server[TotalServers]; 
    int GlobalSecCode; 
}; 

這有沒有一個ServerInfo分配給其他的缺點,因此可能使用std::vector是很重要的,如果這意味着很多給你。

+0

初始化該結構,其相同的方法?也正如Flexo回答的那樣,我需要通過StringLen成員獲取字符串大小,那麼您能設置一個更完整的示例嗎?謝謝。 – ffenix 2012-08-01 19:14:23

0

在C++中沒有很好的方法來實現這一點。

這是如何在PacketLayout創建可變大小的數組:在這種情況下ServerInfo可容納的指針數組

PacketLayout* createPacketLayout(BYTE stringLen) 
{ 
    PacketLayout* packetLayout = (PacketLayout*)new char[sizeof(PacketLayout) - 1 + stringLen]; 
    packetLayout->StringLen = stringLen; 
    return packetLayout; 
} 

struct PacketLayout 
{ 
    int GateCode; 
    BYTE StringLen; 
    BYTE ServerStatus; 
    BYTE ServerStorage; 
    BYTE ServerNumber; 
    char String[1]; 
} 

那麼你分配一個實例。