1

私は現在、AI のプログラミングを学んでいるいくつかの XNA で遊んでいます。とにかく、これが私の状況です。クラス A には、クラス B のインスタンスへの参照を取得し、それに何らかの処理を行い、それを返す関数があります。クラス B にはクラス A のインスタンスが含まれており、そこから関数を呼び出します。

コードの例:

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        this = B.Do(ref this);
    }
}

Class B
{
    public A Do(ref A classA)
    {
        //Manipulate
        return classA;
    }
}

私はメンバーごとのクローンを渡そうとしました..しかし、「これ」は読み取り専用であるため、明らかに機能しませんでした。私はこれを知りません。私は本当に立ち往生しています。誰にもアイデアはありますか?理想的には、オブジェクト内のすべての変数を個別の引数として渡す必要はありません。

アンディ。

4

8 に答える 8

2

クラスは参照型なので、

Class B
{
    public void Do(A classA)
    {
        //Manipulate
    }
}

オブジェクトの classA 参照を操作する必要があります。次にAで、

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        B.Do(this);
    }
}

注: 「これには、渡す A の参照を null に設定できないという副作用があります (ローカル変数を null に設定するだけです)」- JulianR

于 2009-04-18T19:10:35.740 に答える
1

あなたの B.Do() メソッドは、ref と return を使用してそれを行います (A を変更します)。どちらも、classA を変更する必要はありません。そして、あなたがターゲットにしているので、thisとにかくうまくいきません。に割り当てることthisはありません。意味がありません。

したがって、簡単な答えは

class B
{
   void Do(A anA) { anA.PublicProp = 1; }
}

しかし、循環参照は疑わしい設計になっています。

于 2009-04-18T19:01:05.733 に答える
0

オブジェクトは、値ではなく常に参照によって渡されます。そのため、C# でクラスを参照型と呼びます。構造体は値型であるため、代わりに構造体を使用する場合は注意してください。元の構造体ではなく、構造体のコピーが渡されます。オリジナルを渡したい場合は、refキーワードを追加する必要があります。refは、あるオブジェクトへの参照を別のオブジェクトへの参照に置き換えたい場合にのみ、オブジェクトで役立ちます。

于 2009-06-28T17:24:14.523 に答える
0

クラス参照を ref として渡す必要がある //Manipulate に固有のものはありますか? また、なぜclassAも返すのですか-最初にrefを使用している場合、それは冗長なようです。

于 2009-04-18T18:57:15.290 に答える
0

ref キーワードを削除するだけです。引数を別のものに変更したい場合にのみrefが必要です。単に操作したい場合は、refを使用しないでください。

言語でこれをあれに変更できるのは悪いことだと思います(理解するのは難しい)ので、あなたが試したことは許可されません。

于 2009-04-18T19:00:21.630 に答える
0

「this」と一緒に「ref」を使用することはできません。パラメータを参照渡しする必要があるのはなぜですか?

関数が呼び出し元が参照しているオブジェクトを変更する必要がある場合にのみ、「ref」パラメーターが必要です。パラメータのフィールドを操作および/または変更するだけでよい場合は、ref パラメータは必要ありません。

于 2009-04-18T19:01:00.070 に答える
0

より明確にするために、全体は単純な AI の動作 (EG チェイス、ガード、回避など) 用です。AI エンティティ全体をビヘイビアに渡して、すべてのエンティティに対してビヘイビアを個別に保持できるようにしたいと考えています (複数の Web ページ用の 1 つのスタイル シートのようなものです)。オブジェクト全体を渡したい理由は、オブジェクトの特定の部分を必要とする動作と必要としない動作があるためです。

なぜ私が戻ってくるのか..どうやってその決定に至ったのかよくわかりません。私はそれを削除します

于 2009-04-18T19:05:01.590 に答える
0

どうもありがとう、デレク E!

私はあなたが言ったことをテストしたところ、うまくいきました。

私の問題は、引数を渡したときにそのクローンを作成し、代わりにそれを操作したと考えていたことだと思います..)PHPまたはVBで行うように(どれを思い出せないかでそれを行うと言われました)

于 2009-04-18T19:13:39.493 に答える