2012-08-31 136 views
0

我试图尽可能使用SSCE我的问题,但它涉及多个在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"; 
} 

我道歉,真诚为所有这一切,但它是需要做出点。正如你所看到的,我得到了At()我认为是Cell对象,将其访问的实例数据设置为true,然后关闭到另一个单元格。那么,为什么当我回到同一个单元时,发现访问的值是错误的,而不是真的?!这就像它没有注册我的私人数据变化!

这样做的最好方法是什么?

感谢

+0

否。[_this_](http://ideone.com/2fSjR)是[SSCCE](http://sscce.org)。 27行代码,与您的程序有相同的问题。 –

回答

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

+0

我想使用&运算符...但是当我尝试它仍然打印输出/显示上面的行为。使用运算符还有其他一些窍门吗? (请记住getAT返回一个Cell&)。 – PinkElephantsOnParade

+0

@PinkElephantsOnParade已更新。 – ForEveR

+0

@PinkElephantsOnParade:在'Cell&'中,'&'不是一个运算符(运算符是函数)。这意味着'Cell'是一个参考。 –

0

永远的答案是正确的 - 你需要存储由getAt()在引用变量返回的值,而不是复制它变成一个值变量。

您可能会考虑显式声明不应该复制“Cell”类,这将有助于您更快地捕获此类错误。这可以通过声明一个私有拷贝构造函数来完成(没有body);或者如果使用boost,则可以通过继承基类“boost :: noncopyable”(docs for noncopyable)来完成。