1

科学コードを Java から C++ に移行しています。教えてください:

a) 2 つの関数の何が問題になっていますか?
b) どうすれば問題を解決できますか? int**を2 次元配列のように使用できますが、 Agent**.

「このオペランドに一致する演算子 = がありません」というエラーが表示されます。

通常の C では、ポインタに NULL を割り当てることができました。type**2 次元配列 (つまり ) のようなものを使用することもできます(とa[i][j]の 2 次元空間は別の場所に割り当てられます)。objectSpaceagentSpace

    int** objectSpace;
    Agent** agentSpace;

    void Space::removeAgentAt(Point p)
    {
        agentSpace[p.x][p.y] = NULL;
    }

    void Space::putAgentTo(Agent agent, Point p)
    {
        agentSpace[p.x][p.y] = agent;
    }
4

5 に答える 5

3

agentSpaceはポインターであり、agentSpace[p.x]ポインターですが、ポインターでagentSpace[p.x][p.y]はありません。

C++ は Java と同じではありません。オブジェクトは (通常) 参照ではなく、値によって参照されます。

于 2012-05-24T07:43:37.910 に答える
1

C++ では、NULLは単なるエイリアスです0。整数からオブジェクトへの変換をコーディングしていない限り、に代入するAgentことはできません。NULLAgent

1 つの解決策は、ダミーAgentオブジェクトを作成しAgent AgentNone;、代わりにそれを使用することですNULLAgentオブジェクトが と等しいかどうかを確認する場合は、比較演算子を実装する必要がある場合がありますAgentNone

于 2012-05-24T07:46:04.693 に答える
1

これを次のように見てくださいAgent** agentSpace。最初*の配列は配列の最初の次元へのアクセスを提供し、2 番目の配列は*2 番目の次元へのアクセスを提供します。

Agent**はポインタへのポインタです - またはあなたの場合はポインタの配列です。を実行しようとしたとき、コンパイラが考える型の完全なオブジェクトにagentSpace[p.x][p.y] = NULL代入しようとしていました。別のレベルの間接化が必要です。NULLAgent

Agent*** agentSpace = 
    {
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }
    };
于 2012-05-24T08:03:47.900 に答える
0

Agentクラスの代入演算子を定義する必要があると思いますか?

于 2012-05-24T07:44:49.887 に答える
0

コードを元のコードと照合しやすくするには、配列の次元を指定します。

int   objectSpace[100][200];   // but use the actual dimensions
Agent agentSpace[250][300];    // todo:  fix dimensions

さらに良いのは、定義済みの定数を使用することです。

int   objectSpace[OS_X_MAX][OS_Y_MAX];
Agent agentSpace[AS_X_MAX][AS_Y_MAX];

これがすべてのモジュールで見られるヘッダー ファイルにある場合、コードは正しく機能します。これらの配列のいずれかがパラメーターとして渡される場所がある場合、関数のプロトタイプと実装を書き直す必要がある可能性があります。

于 2012-05-24T07:49:58.763 に答える