0

次の構造体を宣言しました。

struct StartPositions
{
    public Vector2 pacman;
    public Vector2[] ghosts;

    // Constructor accepts a Vector2, and an array of Vector2's.
    public StartPositions(Vector2 pacmanPosIn, Vector2[] ghostsPosIn)
    {
        pacman = pacmanPosIn;
        for(int a=0;a<ghostsPosIn.Length;a++)
        {
            ghosts[a] = ghostsPosIn[a];
        }
    }
}

ただし、ghosts フィールドを完全に割り当てる必要があるというコンパイラ エラーが発生します。私がやりたいことは、Vector2 を渡し、StartPositions オブジェクトを作成するときに Vector2 配列を渡し、その配列のコピーを作成することです。

どうすればこれを正しく行うことができますか?

4

4 に答える 4

2

ghostsアレイを初期化していません。への呼び出しを追加する必要がありますnew

public StartPositions(Vector2 pacmanPosIn, Vector2[] ghostsPosIn)
{
    pacman = pacmanPosIn;
    ghosts = new Vector2[ghostsPosIn.Length];
    ....
}

forまた、ループを への呼び出しに置き換えることで、コードを簡素化できますArray.Copy()

Array.Copy(ghostsPosIn, ghosts, ghosts.Length);
于 2013-04-14T15:45:34.030 に答える
1

ghosts最初に配列を初期化する必要があります。

struct StartPositions
{
    public Vector2 pacman;
    public Vector2[] ghosts;

    // Constructor accepts a Vector2, and an array of Vector2's.
    public StartPositions(Vector2 pacmanPosIn, Vector2[] ghostsPosIn)
    {
        pacman = pacmanPosIn;
        ghosts = new Vector2[ghostsPosIn.Length];
        for(int a=0;a<ghostsPosIn.Length;a++)
        {
            ghosts[a] = ghostsPosIn[a];
        }
    }
}
于 2013-04-14T15:44:58.733 に答える
0

.net の厄介な問題の 1 つは、「安全でない」コードを使用しない限り、値型配列の概念が存在しないことです。示されている構造体には、「pacman」の位置と、ゴーストの位置を保持する可変配列への参照が含まれています。構造体はゴーストの位置をカプセル化しているように見えるかもしれませんが、そうではないため、これは悪い組み合わせです。したがって、次のように言うとします。

StartPositions p1 = whatever();
... do some stuff
StartPositions p2 = p1;
p2.pacman.X += 3;
p2.ghosts[0].X += 3;

p2.pacmanコードはandに 3 を追加しp2.ghosts[0]ます。影響はありませp1.pacman.Xが、に 3 つ追加されます。このような行為は混乱を招く可能性があります。p1.ghosts[0]

意図がStartPositions読み取り専用である場合、ghosts配列を直接公開することはおそらくないでしょう。代わりに、ghoststype のプロパティである必要があり、コンストラクターは、渡された位置のコピーで初期化されIList<Vector2>た new のようなものに設定する必要があります。ReadOnlyList<Vector2>その場合、ghostsそのような位置を返す読み取り専用プロパティにすることができます。

于 2013-04-15T16:39:43.563 に答える
0

ghosts配列を初期化していません。

public StartPositions(Vector2 pacmanPosIn, Vector2[] ghostsPosIn)
{
    ...
    ghosts = new Vector2[ghostsPosIn.Length];
    ...
}

C #言語仕様より;

実際の配列インスタンスは、実行時に new演算子を使用して動的に作成されます。new 操作は、新しい配列インスタンスの長さを指定し ます。これは、インスタンスの存続期間中固定されます。

于 2013-04-14T15:46:21.703 に答える