0

我试图尽可能地解决我的问题,但它涉及在 C++ 中定义的多个对象。不过,它们很简单——我认为最好在进一步解释之前分享我的代码:

#include <iostream>
#include <vector>

struct Cell {
        bool visited;
        Cell():visited(false) {}
        void setVisited(bool val) {visited = val;}
        bool beenVisited() {return visited;}
};
struct Vector2D
{
        int size;
        std::vector<Cell> myVector;
        Vector2D(int n): size(n), myVector(n*n) {}
        Cell& getAt(int x, int y) {return myVector[((x * size) +y)];}
};

int main()
{
    Vector2D vec = Vector2D(1);
    Cell cell= vec.getAt(0,0);

    cell.setVisited(true);
    cell = vec.getAt(0,0);
    if (cell.beenVisited() == false)
        std::cout << "Why is this not true like I set it a moment ago?\n";
}

我为所有这一切真诚地道歉,但有必要说明这一点。如您所见,我 getAt() 我认为是 Cell 对象,将其访问的实例数据设置为 true,然后关闭到另一个单元格。那么,为什么当我回到同一个单元格时,发现访问的值是假而不是真?!好像它没有注册我的私人数据更改!

做这个的最好方式是什么?

谢谢

4

2 回答 2

3
Cell cell= vec.getAt(0,1);

对象的副本。采用

Cell& cell = vec.getAt(0, 1);

或者干脆

vec.getAt(0, 1).setVisited(true);

编辑。

这段代码应该可以工作。

using namespace bob;
Vector2D vec = Vector2D(5);
vec.setAt(0,0, Cell(0,0));
vec.setAt(0,1, Cell(0,1));
vec.setAt(0,2, Cell(0,2));
Cell& cell= vec.getAt(0,1);

cell.setVisited(true);
Cell cell1 = vec.getAt(0,2);
cell1 = vec.getAt(0,1);
if (cell1.beenVisited() == false)
{
    std::cout << "Why is this not true like I set it a moment ago?" << std::endl;
}

http://liveworkspace.org/code/53634eda052a07885d4e6c062a0fd302

于 2012-08-31T15:49:52.853 回答
0

ForEveR 的答案是正确的——您需要将 getAt() 返回的值存储在引用变量中,而不是将其复制到值变量中。

您可能会考虑明确声明不应复制“Cell”类,这将帮助您更快地捕获此类错误。这可以通过声明一个私有复制构造函数(没有主体)来完成;或者,如果您使用的是 boost,那么可以通过从基类 "boost::noncopyable" ( docs for noncopyable ) 继承来完成。

于 2012-08-31T17:02:31.387 回答