1

以下は私が書いたコードです Calc[] calculators = new Calc[10]; calculators[0].AddToSum(10);(対応するクラスとメソッドが書かれています)。しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外が発生しました。次に、いくつかの調査で、次のようにして例外を削除しました。

for (int i = 0; i < 10; i++)
        {
            calculators[i] = new Calc();
        }  

c/c ++とは異なり、メモリを再度割り当てる必要がある理由を誰かが説明できますか? これは私がC ++で行った方法です:

Calculator *calc=new Calculator[10]//I know I need to check for std::bad_alloc exception
calculators[0].AddToSum(10); 
delete[] calc;
4

6 に答える 6

1

new Calc[10] では、配列の割り当てとサイズ変更を行っています。new Calc() では、実際の Calc オブジェクトを作成しています

于 2013-05-07T14:23:14.790 に答える
1

しかし、このステートメントでも同じエラーが発生します

Calc calc; 
calc.AddToSum(10);

値を割り当てるまで、オブジェクトは null です。

Calc[] 電卓 = 新しい Calc[10]; 割り当てません。

Benjamin (+1) からの回答に基づいて、Calc が参照型の場合に機能します。
Calc を構造体にすることはできますか?

于 2013-05-07T14:25:18.360 に答える
0

メモリを再度割り当てる必要はないと思いますが、 の値をインスタンス化する必要がありますcalculators[0]

.AddToSum最初のコード セグメントでは、値を呼び出そうとしていますNull

Ps:代わりに次のようにしてCalc、最初からそれぞれを初期化できます。

Calc[] calculators = new Calc[10]{  
                                   new Calc(), 
                                   new Calc(), 
                                   ..., 
                                   // Repeat 10 times to match array length
                                  };

更新:以下のコメントへの対応。それでは、これを試してください:

calc[] calculators = Enumerable.Repeat(new Calc(), 127).ToArray<Calc>();
于 2013-05-07T14:17:54.317 に答える
0

C++ でオブジェクトの配列を作成すると、各オブジェクトのすべてのフィールドにメモリが割り当てられます。したがって、オブジェクトに 2 つの整数フィールドがあり、サイズが 2 の配列を作成する場合、4 つの整数を保持するのに十分なメモリが割り当てられます。

一方、C#では、作成しているオブジェクトの配列と参照の配列(オブジェクトへのポインター)を作成する場合。そのため、参照ごとに (new を使用して) メモリを割り当てない限り、インスタンスを格納することはできません。

C++ で同じことを行うと、ポインターの配列が作成され、配列の各要素をインスタンス化する必要があります。

于 2013-05-07T14:33:13.273 に答える