0

このクラスの他のインスタンスへのいくつかのポインターを持つクラスを作成したいと思います。隣のセルをセットできるライフゲームを作りたいです。

私が抱えている問題は、constポインターメンバー変数への参照を割り当てることができないことです。

class Cell {

            ...
        const Cell* left;
            ...

        void setLeft(const Cell & left) {
        this->left = left;
    }
}

このようなベクトルですべてのセルを保存するというアイデアがありました

std::vector<Cell::Cell> cells;

次に、これらにアクセスして次のように設定しますcells[pos].setLeft(cells[left]);(posとleftは整数になります)

次のエラーメッセージが表示されます。Can't convert const cell to const cell* in assignment。また、メソッドが見つかりませんsetLeft

私はJava/Netのバックグラウンドを持っているので、たぶん大きな間違いを犯しただけです。

4

3 に答える 3

2

あなたはポインタと参照を混同しています(これはjava / netから来ているときに理解できます)。C ++では、次の間に明確な違いがあります。

  1. Cell x;、クラスのオブジェクト(インスタンス)Cell
  2. Cell *x;、のインスタンスへのポインタCell
  3. Cell &x;、のインスタンスへの参照(「別の名前」)Cell

Javaの「参照」はC++ポインタと同等です。

あなたの場合、いくつかの問題があります。まず、次setLeft()のように、引数のアドレスを取得する必要があります。

void setLeft(const Cell & left) {
  this->left = &left;
}

次に、クラスCellが名前空間Cellで定義されていない限り、ベクトルは単に。と入力する必要がありますstd::vector<Cell> cells;

ただし、さらに危険なのは、ベクターに静的に割り当てられたCellオブジェクトが含まれていることです(そのテンプレート引数は、ポインターではなくクラスタイプです)。std::vectorに追加されたときにメモリ内のオブジェクトを移動できるため、これが発生すると、に格納されているオブジェクトへの既存のすべてのポインタcellsがぶら下がります。代わりに、ポインタをベクトルに格納する必要があります。

std::vector<Cell*> cells;
cells[pos]->setLeft(*cells[left]); //assuming setLeft() still takes a reference

実際には、生のポインターの代わりにスマートポインター(std::shared_ptrおよび)を使用する方が良いかもしれませんが、それは別のトピックです。std::weak_ptr

于 2012-11-27T12:53:31.240 に答える
1

setLeft関数はCellconst参照を取得しており、それをへのポインターに割り当てようとしていますconst Cell。ポインタをポインタに割り当てる必要があります。

void setLeft(const Cell* left) {
    this->left = left;
}

次に、にポインタを渡す必要がありますCell。例えば:

Cell a;
Cell b;
a.sefLeft(&b);
于 2012-11-27T12:46:09.753 に答える
1

セルの前にアンパサンドを追加します[左]。あなたがすることは、インスタンスをポインタ値に割り当てることです。

cells[pos].setLeft(&cells[left]);

一般に、変数の前の&は、この変数のアドレスを示します。

編集:

例を編集した後、&を*に置き換える必要があります。変数の前のstar演算子は、ポインターからのインスタンス(または参照)を提供します。簡単に言った...:-)

于 2012-11-27T12:46:28.757 に答える