2014-09-04 116 views
0

現在幾個小時我一直在努力研究如何將動態內存分配給某個playerid,當他們加入服務器,並在他們離開時銷燬它。分配動態內存給玩家ID

我試過很多東西,我試圖使指針數組...這會允許我使用指針和數組的位置與玩家ID訪問信息:

int *pInfo[MAX_PLAYERS]; // Global 

//Function Local 
CPlayers p; 
pInfo[playerid] = p; 

哪它不能工作,它告訴我它不能將類初始化轉換爲內存指針。

我想同樣的事情,這條線來代替:

std::unique_ptr<CPlayers> pInfo[playerid]; 

然而它需要一個常量表達式,其中playerid的是,這意味着我不能這樣做,除非我知道玩家ID是什麼,直接輸入......這是不可能的,因爲直到他們的客戶端嘗試連接時我纔會知道。

有沒有人有一個解決方案,可以讓我動態地創建內存,並讓這個內存可以通過playerid訪問。或者其他一些時尚,我無限期地在遊戲中使用客戶信息。

因爲我已經用完了想法......我在網上找不到任何東西。我也是新手,所以可能會有我看過的功能。

謝謝。

回答

1

您可以使用MAP容器來做到這一點。理想是你有2個值。第一個是playerID,第二個是動態內存引用,它包含了它的屬性。以下是一個簡單的例子來證明這個概念。

#include <map> 
#include <memory> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::unique_ptr<int>> pinfo; 

    // Inserting some elements. 
    pinfo.emplace(1, std::unique_ptr<int>(new int{3})); 
    pinfo.emplace(800, std::unique_ptr<int>(new int{700})); 

    for (auto& i: pinfo) 
     std::cout << "Player " << i.first << ", value " << *i.second.get() << std::endl; 

    // Deleting. Note that, due unique_ptr, the memory is deallocated automatically 
    pinfo.erase(1); 

    std::cout << "Player 1: deleted" << std::endl; 
    for (auto& i: pinfo) 
     std::cout << "Player " << i.first << ", value " << *i.second.get() << std::endl; 
} 
+0

謝謝,我跑你的測試代碼。它完美地運行,像夢一樣分配和分配內存:D。謝謝你的回覆,你一直在幫助很大。現在我可以回到學習了:)。 – user1591117 2014-09-04 01:39:30