2014-09-03 35 views
0

我目前正在研究一個涉及玩家的C++項目,每個玩家需要在服務器上存儲關於他的信息以確定他做或應該如何迴應。服務器最多可以有1000個插槽,我不想留下剛分配給程序的未使用的內存,並且在播放器連接或連接時不會創建和銷燬。動態分配內存給連接玩家,然後在他離開時摧毀它(混合類型)

我知道我可以動態分配內存是這樣的:

int *Pointer = new int Example[10]; 

這將讓我來存儲10個整數,我可以就這個播放器的一些信息。然而我不知道的以及爲什麼我問這個問題:

我該如何使用這個功能或類似的功能來存儲玩家信息。就像一個專門用來存放玩家數據的結構或類一樣。然後刪除它,一旦他離開?

什麼,我需要它來保存將是值的混合範圍內的一個例子:

double Pos[3]; 
int Mode; 
string Name; 

換句話說,我需要它保持一個混合型的變量,並能夠鏈接此直接回與其相關的玩家ID?

謝謝。

+1

製作一個管理所有玩家數據的類,爲對象的分配創建一個'std :: unique_ptr',當它們斷開連接時破壞unique_ptr? – cdhowie 2014-09-03 21:13:15

+0

好的,謝謝我會研究它:)。我在Google上點擊了幾次,看起來就像我在找什麼。 感謝您的幫助,併爲啞巴問題感到抱歉。我還在學習 :)。 – user1591117 2014-09-03 21:20:04

+0

@ user1591117 - 當你在編譯時知道入口的數量時,爲什麼需要動態分配?所有你需要的是'int Example [10];'如果只在運行時知道例子的數量,那麼更好的選擇是使用'std :: vector ' – PaulMcKenzie 2014-09-03 21:31:13

回答

0

您可以定義一個Player類來存儲玩家的信息。

class Player { 
public: 
    double Pos[3]; 
    int Mode; 
    string Name; 
}; 

然後,你可以定義一個map給玩家ID與Player對象關聯。

map<int, Player*> playerList; 

當連接的球員,你可以這樣分配內存:

Player *p = new Player(); 
int playerID = xxx; 
playerList[xxx] = p; //store the <playerID, p> relationship in the map 

然後你可以根據需要訪問字段:

p->Pos[i] = xxx; 
p->Mode = xxx; 
p->Name = xxx; 

當玩家離開,你可以像這樣釋放內存:

int playerID = xxx; 
Player *p = playerList[playerID]; 
delete p; //deallocate the Player class 
playerList.erase(playerID); //deallocate the map entry that stores the <playerID, p> pair 

對於class的更高級用途,您可以參考此tutorial on classes。 您也可以參考this瞭解如何使用map

+0

這是正確的概念,儘管我強烈建議儘可能使用智能指針,而不是使用原始指針。 – cdhowie 2014-09-03 22:00:25

+0

這就是我最初想做的事情,但是我不能將指針的值賦給玩家。之後,我開始玩矢量包括,這讓我感到困惑。 我還沒有制定出如何將指針,智能或正常指針直接鏈接到特定玩家ID。因爲一切都需要「恆定的價值」。哪一個playerid,在OnPlayerConnect函數中會改變。 例如也許指針數組int * pInfo [MAX_PLAYERS];從未工作。我嘗試了很多猜測工作,並使用Google搜索。 – user1591117 2014-09-03 22:07:11

+0

@ user1591117根據您的描述,我已經更新了上面的答案。這是否回答你的問題? – w00dbunny 2014-09-04 01:04:08