簡體   English   中英

從函數返回unique_ptr的向量

[英]Returning a vector of unique_ptr from function

我目前正在閱讀Head First Object Oriented Analysis and Design這本書,同時也習慣了C ++ 11的一些特性(特別是unique_ptr和移動語義)。 在書中,他們以策略棋盤游戲的設計為例。 它有一塊板,瓷磚和瓷磚單位。 代碼是用Java編寫的,我試圖用C ++重寫它。 在Java中,tile類如下:

public class Tile
{
    private List units;

    public Tile()
    {
        units = new LinkedList();
    }

    protected void addUnit(Unit unit)
    {
        units.add(unit);
    }

    protected List getUnits()
    {
        return units;
    }
}

我首先使用shared_ptr在c ++中做了同樣的事情。 與使用原始指針的第二個版本相比,它工作但非常慢。 然后我嘗試了unique_ptr:

class Tile
{

public:
  Tile();
  virtual ~Tile();

  void addUnit()
  {
    mUnits.push_back(std::unique_ptr<Unit>(new Unit());
  }

  std::vector<std::unique_ptr<Unit>> getUnits()
  {
    return mUnits;
  }

private:
  std::vector<std::unique_ptr<Unit>> mUnits;

};

編譯器不喜歡getUnits。 據我所知,它來自於unique_ptr中禁用了復制構造函數的事實。 你會如何返回向量列表? 謝謝!

在C ++中返回的值會產生一個副本 - 如果這是你想要的,你不能使用unique_ptr或者必須進行手動復制並且std::move它。 但是,我帶你只想提供對Unit的訪問(無論出於何種原因......),所以只需返回一個引用:

std::vector<std::unique_ptr<Unit>> const& getUnits() const
{
  return mUnits;
}

(只有在您不想向向量提供寫訪問權限時才需要const 。)

現在,仍然會出現一些問題:為什么~Tile virtual 我認為沒有必要。

為什么使用擁有的 ptr指向單位? 在原始的Java代碼中,您將獲得對外部單元的引用並僅存儲引用 - 如果Java代碼中的Tile被銷毀,則單元不是(從我可以看到的),只要它們被引用到某處其他。 要在C ++中實現完全相同,使用shared_ptr是正確的。

當然,您可以澄清是單位的真正所有者並相應地操作 - 如果它不是 Tile ,則使用原始指針。 另請參閱“我在何時使用哪種指針?”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM