0

私は以下を持っています

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>'

先のとがったアイテムへの一時的な参照を取得するにはどうすればよいですか?

4

2 に答える 2

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])
于 2013-02-16T19:05:01.093 に答える
0

std::unique_ptr 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;
  }
于 2013-02-16T19:08:12.920 に答える