0

一連のスキルと一連のスペシャルを持つ「プレイヤー」を作成しようとしています。各スキルは特定のスペシャルに関連付けられています。

その後、プレイヤーには 7 つのスペシャルと 13 のスキルが与えられます。より読みやすくするために (私の意見では)、スペシャル、スキル、プレイヤーには構造体を使用します。これは、構造体を使用する場合にも当てはまります。

私のコードを見てください、それはかなり簡単です。

private struct specials
{
   public string name;
   public int value;

   public specials(string n, int v)
   {
       this.name = n;
       this.value = v;
   }
}

private struct skills
{
    public string name;
    public specials spec;
    public int value;

    public skills(string n, specials s, int v)
    {
        this.name = n;
        this.spec = s;
        this.value = v;
    }
}

public struct player
{
    public specials strength = new specials("STRENGTH", 0);
    public specials perception = new specials("PERCEPTION", 0);
    public specials endurance = new specials("ENDURANCE", 0);
    public specials charisma = new specials("CHARISMA", 0);
    public specials intelligence = new specials("INTELLIGENCE", 0);
    public specials agility = new specials("AGILITIY", 0);
    public specials luck = new specials("LUCK", 0);

    //Complains about charisma, saying an object reference is required for 
    // the nonstatic field method or property
    public skills barter = new skills("Barter", charisma, 0); 
}

私の問題は、コードのコメントで確認できます。さて、なぜこれが問題になるのかわかりません。

プレイヤーには自分の必殺技と自分のスキルが与えられ、そのスキルが必殺技に関連付けられます (参考になれば幸いです)。

public specials charisma = new specials("CHARISMA", 0);

これにより、カリスマという名前の新しい特別なオブジェクトが作成されますよね? では、なぜこれを新しいスキル オブジェクトに渡すことができないのでしょうか。

最後に一つだけ。何らかの理由で私はまだ理解していませんが、本当に知りたいのですが、これはカリスマ性を宣言するときに static を使用することで解決されますが、入力してフォームクラスで変更することはできません

player.charisma.value = 123;

よろしく!


編集:

説明できない何かを発見しました。書く代わりに(エラーが発生しました)

public skills barter = new skills("Barter", charisma, 0);

私は次のように書いています:(プレイヤーはクラスになりました)

public skills barter = new skills();

次に、プレーヤーのコンストラクターで、物々交換を次のように特別に設定できます。

barter.spec = strength;

なぜこれが免除されるのですか?これは悪い習慣ですか?構造体が参照ではなく値で渡されることを知ったので、プレイヤースペシャルを変更すると物々交換で更新されないため、とにかく使用しません。しかし、構造体を使用して構造体を初期化できない理由についての私の質問はまだ残っています。

4

2 に答える 2

2

まず第一に、定義する最初の構造体はプライベートです。これは奇妙です (他の型にネストされている場合を除きます)。

第二に、構造体にインスタンス フィールド初期化子を含めることはできないため、基本的に構造体全体playerが無効であるため、最初にこれに遭遇せずに説明したエラーがどのように発生したかわかりません。

とにかく、おそらくクラスを使用する必要があります。

最後の質問については、静的メンバーは、そのタイプのインスタンスではなく、タイプに関連付けられているため、個々のインスタンスに対してそれらを変更することはできません。

于 2013-11-06T09:29:06.583 に答える
0

構造体はVALUE TYPESです。つまり、新しいキーワードでそれらをインスタンス化することはできません。で直接試してください

public specials charisma = specials("CHARISMA", 0)

また、チェックアウト: http : //msdn.microsoft.com/en-us/library/s1ax56ch.aspx

于 2013-11-06T09:16:38.053 に答える