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";
}

このすべてについて心からお詫び申し上げますが、要点を説明するために必要です。ご覧のとおり、Cell オブジェクトと思われるものを getAt() し、アクセスしたインスタンス データを true に設定してから、別のセルに切り替えます。では、同じセルに戻ったときに、訪問した値が true ではなく false であることがわかるのはなぜですか?! 個人データの変更が登録されていないようです。

これを行う最善の方法は何ですか?

ありがとう

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::noncopyable」( docs for noncopyable )から継承することで実行できます。

于 2012-08-31T17:02:31.387 に答える