获取对unique_ptr<>?数组的项的引用

时间:2013-02-16 19:02:33

标签: c++ pointers

我有以下

class Panel {
public:
  std::array<std::array<std::unique_ptr<fb::Block>, Panel::Y>, Panel::X> blocks;
};

我有一个像这样的成员函数:

void Panel::processMove() {
  if (move == nullptr) {
    return;
  }
  MoveType type = move->type;
  switch (type) {
    case MoveType::BLOCK_SWITCH: {
      std::unique_ptr<fb::Block> src = blocks[cursor.x][cursor.y];
      std::unique_ptr<fb::Block> dst = blocks[cursor.x + 1][cursor.y];

      if ((src == nullptr) && (dst == nullptr)) {
        break;
      }
      ...
    }
  }

我不知道如何获得对指向项的临时引用,因为此代码无法编译并出现以下错误:

call to implicitly-deleted copy constructor of 'std::unique_ptr<fb::Block>'

我该如何获得指向项目的临时引用?

2 个答案:

答案 0 :(得分:2)

只需将其作为参考:

std::unique_ptr<fb::Block>& src = blocks[cursor.x][cursor.y]
std::unique_ptr<fb::Block>& dst = blocks[cursor.x + 1][cursor.y]

事实上,由于你使用的是C ++ 11,你可以使用auto

来缩短这一点。
auto& src = blocks[cursor.x][cursor.y]
auto& dst = blocks[cursor.x + 1][cursor.y]

或者,如果你知道所有唯一指针都有一个指向有效对象的指针,你可以获得对象本身的引用,完全绕过指针(感谢@ChrisHartman)

fb::Block& src = *(blocks[cursor.x][cursor.y]);
fb::Block& dst = *(blocks[cursor.x + 1][cursor.y]);

//C++11 auto:
auto& src = *(blocks[cursor.x][cursor.y])
auto& dst = *(blocks[cursor.x + 1][cursor.y])

答案 1 :(得分:0)

std::unique_ptr can be evaluated as a bool检查它是否指向某个对象。

改变这个:

  std::unique_ptr<fb::Block> src = blocks[cursor.x][cursor.y];
  std::unique_ptr<fb::Block> dst = blocks[cursor.x + 1][cursor.y];

  if ((src == nullptr) && (dst == nullptr)) {
    break;
  }

到此:

  std::unique_ptr<fb::Block> &src = blocks[cursor.x][cursor.y];
  std::unique_ptr<fb::Block> &dst = blocks[cursor.x + 1][cursor.y];

  if ( !src && !dst )) {
    break;
  }