2

これにより、参照によって戻ることをどういうわけか認識しており、混乱しました。

BoardNodeクラスのpublic フィールドへの参照を返す関数がありますstd::vector<BoardNode> _neighboursVector

Boardを保持するクラスもありますstd::vector<BoardNode>

私のメンバー関数は次のようになります:

const std::vector<BoardNode>& 
Board::getNeighboursVector(unsigned int x, unsigned int y) const
{
    BoardNode node = this->getBoardNode(x, y);
    //...
    node._neighboursVector.push_back(...);
    //...
    return node._neighboursVector;
}

戻り行でデバッグしているときに、ベクトルで正しい値を取得しますが、この関数の外では空のベクトルを取得します。なんで ?

std::vector<BoardNode> v = b.getNeighboursVector(5,5);

編集

getBoardNode定義

const BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx) const
{
//...
}

BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx)
{
//...
}
4

2 に答える 2

6

nodeローカルオブジェクトです。ひいてはnode._neighborsVector、ローカル オブジェクトでもあります。ローカル オブジェクトとして、関数の最後に破棄されます。したがって、破棄されたオブジェクトへの参照を返しています。それは未定義の動作です。

于 2012-11-23T14:14:36.543 に答える
2

nodeスタック上に (関数に対してローカルに) 作成されるため、関数の最後で削除されます。あなたが返す参照はフィールドであるため、nodeそれも削除されます。したがって、削除されたオブジェクトへの参照を返します。

値 (この場合はコピー コンストラクターを正しく実装します。ここでstd::vectorは問題ありません) またはポインター (new によって作成されdelete、返されたオブジェクトを使い終わったら忘れないでください) で返す必要があります。

于 2012-11-23T14:14:48.390 に答える