2016-03-05 44 views
-2

我正在做一個基於文本的RPG樣的東西在C++中聲明後,初始化正大小的數組,而我使庫存類。這裏是我的代碼:如何在C++

class Inventory { 
    public: 
     int size; 
     Item items[]; 

     Inventory(int size): size(size) { 

     } 
}; 

在構造函數中,我需要設置itemsItem s的長度尺寸的數組。我知道在Java中,我只是做this.items = new Item[size],但我一直在尋找一段時間,甚至在cplusplus.com教程上,它並沒有說我該怎麼做。有沒有辦法?如果是這樣,怎麼樣?

+1

你不能,使用'std :: vector items;'而不是。 –

+0

好的謝謝,生病嘗試。然而,一個問題是我需要限制尺寸。我可以使用矢量來做到這一點,還是我必須手動限制它(例如,一旦它太大,不要讓它向矢量添加更多項目) –

+0

取決於您如何實際將'Items'添加到被插入的矢量/數組中。 –

回答

2

C++不支持此有關的原始陣列。在C++中預期的是使用std::vector<Item>代替:

class Inventory { 
    public: 
     int size; 
     std::vector<Item> items; 

     Inventory(int size): size(size), items(size) { 

     } 
}; 
+0

我們爲什麼要去向量?我們可以通過簡單的'新'和'刪除'解決這個問題吧? –

+1

@GilsonPJ讓'new' /'delete'的權利變得複雜並且充斥着你從未想過的陷阱。 C++標準容器類旨在爲您解決所有這些問題。沒有必要一直重新發明輪子。 –

+0

動態分配似乎有點過分 – ALOToverflow

2

使用std::vector<Item>是一個和這裏唯一明智的解決方案。

在另一個答案評論,您要添加這條信息:

的一個問題,但是,是我需要限制大小。我可以自己做到這一點 與載體或我必須手動限制它(例如不讓它 添加更多的項目到矢量一旦它太大)

一個std::vector是很無限。它唯一的實際限制是可用內存。

但是,無論如何,你應該養成封裝容器類別的習慣。通常情況下,容器類提供了比您在某個特定用例中所需的功能更多的功能。例如,您的items成員變量可能永遠不需要rbegin(),cend(),shrink_to_fit(), difference_type,get_allocator()pop_back(),僅舉幾個示例。

因此,很好的做法,建立一個只提供那些你真正需要操作的自定義數據類型,並在std::vector方面實現自定義數據類型。然後實現額外的約束變得微不足道。

實施例:

#include <vector> 
#include <string> 
#include <stdexcept> 
#include <exception> 
#include <iostream> 

// just a super-simple example: 
struct Item { 
    std::string name; 
}; 

// wraps std::vector<Item>: 
class Items { 
public: 
    Items(int max_size) : 
     max_size(max_size), 
     items() 
    { 
    } 

    void Add(Item const& item) { 
     if (static_cast<int>(items.size()) == max_size) { 
      throw std::runtime_error("too many items"); 
     } 
     items.push_back(item); 
    } 

    Item Get(int index) const { 
     return items[index]; 
    } 

private: 
    int max_size; 
    std::vector<Item> items; 
}; 

int main() 
{ 
    Items items(5); 
    try { 
     items.Add({ "sword" }); 
     items.Add({ "shield" }); 
     items.Add({ "torch" }); 
     items.Add({ "axe" }); 
     items.Add({ "boots" }); 
     std::cout << items.Get(3).name << "\n"; 
     items.Add({ "gloves" }); 
    } catch (std::exception const& exc) { 
     std::cerr << exc.what() << "\n"; 
    } 
} 

注意,這個例子使用例外處理錯誤。這可能不適合您的使用情況;您可以考慮改爲assert

+0

那麼,你至少把這個負擔解釋到底。優秀(我現在太懶了)。我親愛的鄰居來自巴伐利亞的問候。 –

+0

@πάνταῥεῖ:這一定是我老的助教精神:)謝謝! –