为什么我不能更改矢量中的对象?

Why can't I change objects in a vector?

本文关键字:对象 不能 为什么      更新时间:2023-10-16

我有一个类TileGrid,它有一个std::vector< std::vector<Tile> >。访问矢量中的Tile对象有效,但我无法更改它们的属性?为了完成,以下是所有相关类:

Tilegrid.h

#include <vector>
#include "tile.h"
class TileGrid {
public:
  TileGrid();
  TileGrid(unsigned int rows, unsigned int cols);
  virtual ~TileGrid();
  unsigned int getRows() const { return rows_; };
  unsigned int getCols() const { return cols_; };
  Tile atIndex(unsigned int row, unsigned int col) const { return tiles_[row].at(col); };
private:
  std::vector< std::vector<Tile> > tiles_;
  unsigned int rows_;
  unsigned int cols_;
};

瓷砖网格.cpp

#include "tilegrid.h"
TileGrid::TileGrid() : rows_(0), cols_(0) {
}
TileGrid::TileGrid(unsigned int rows, unsigned int cols) : rows_(rows), cols_(cols) {
  tiles_.clear();
  for (unsigned int y = 0; y < rows_; y++) {
    std::vector<Tile> horizontalTiles;
    for (unsigned int x = 0; x < cols_; x++) {
      horizontalTiles.push_back(Tile());
    }
    tiles_.push_back(horizontalTiles);
  }
}
TileGrid::~TileGrid() {
}

磁贴.h

class Tile {
public:
  Tile();
  virtual ~Tile();
  bool isActive() const { return isActive_; };
  void setActive(bool status) { isActive_ = status; };
private:
  bool isActive_;
};

磁贴.cpp

#include "tile.h"
Tile::Tile() : isActive_(false) {
}
Tile::~Tile() {
}

主.cpp

#include "tilegrid.h"
#include <iostream>
int main() {
  TileGrid tg(20, 20);
  for (unsigned int i = 0; i < tg.getRows(); i++) {
    for (unsigned int j = 0; j < tg.getCols(); j++) {
      if (tg.atIndex(i, j).isActive()) {
        std::cout << i << "," << j << " is active" << std::endl;
      } else {
        std::cout << i << "," << j << " is NOT active" << std::endl;
      }
    }
  }
  // This is all working. But when I for example use the setActive function, nothing changes:
  tg.atIndex(1, 0).setActive(true);
  // When I print it again, the values are still the ones that were set in the constructor
  for (unsigned int i = 0; i < tg.getRows(); i++) {
    for (unsigned int j = 0; j < tg.getCols(); j++) {
      if (tg.atIndex(i, j).isActive()) {
        std::cout << i << "," << j << " is active" << std::endl;
      } else {
        std::cout << i << "," << j << " is NOT active" << std::endl;
      }
    }
  }
  return 0;
}

我真的很抱歉所有这些代码...我试图让它尽可能简短,但我认为最好全部发布!

所以是的,我的问题是setActive函数。当我只是创建一个Tile并调用其setActive函数时,一切正常,但是当我通过TileGrid对象调用它时,它不会。

我已经尝试自己解决这个问题几个小时了,我不能再直截了当地思考了。我在这里真的很绝望,你能不能看看,也许可以帮助我?

在你的方法中:

Tile atIndex(unsigned int row, unsigned int col) const

应返回对磁贴的引用:

Tile& atIndex(unsigned int row, unsigned int col)

现在您正在返回副本,这就是修改不起作用的原因。也不应该const,否则你会得到编译器错误。