DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データクラスを用いた配列にアクセスしようとするとエラーが出る

環境/言語:[OS : Windows 7 / 言語 : C++ / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

お世話になります。

現在、C++.NETのWindowsアプリケーションを作成していたところ、

'System.NullReferenceException' のハンドルされていない例外が ****.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。

とのエラーが吐かれました。

そのオブジェクトはデータクラスで、下記の様な構成です。
class data_a
int i;
double d;
-----------------------------
class data_b
data_a^ da1;
data_a^ da2;
data_a^ da3;

/*data_bコンストラクタ*/
 da1 = gcnew data_a;
da2 = gcnew data_a;
da3 = gcnew data_a;
-----------------------------
class data_c
array<data_b^>^ db;

/*data_cコンストラクタ*/
db = gcnew array<data_b^>(259200);
------------------------------
変数は全てメンバ変数です。

最終的にメインで
data_c^ dc = gcnew data_c;
と、データクラスのインスタンスを生成しています。
ここで、this->dc->db[0]->da->i = 0;といったアクセスを行うと上のようなエラーとなります。
すみません、途中で送信してしまいました。

データクラスの配列は作れないものなのでしょうか?
宜しくお願い致します。
■No30046に返信(tanakaさんの記事)
> データクラスの配列は作れないものなのでしょうか?

作れます。
ただ、あなたの書いたコードは配列を準備しただけで、その配列の中を初期化していませんよね?

// a という箱に data_a の新しいインスタンスを入れる
data_a^ a = gcnew data_a();

// b に data_a の箱を 2 つ用意している
// が、箱は空っぽなので、配列の要素は nullptr
// その nullptr に対してアクセスすると NullReferenceException が起きる
array<data_a^>^ b = gcnew array<data_a^>(2);

要するに、配列を初期化した後、配列の各要素を初期化する必要があります。
上の例なら b[0] = gcnew というような形です。後はループで工夫してください。
2012/03/07(Wed) 10:38:47 編集(投稿者)
2012/03/07(Wed) 10:38:43 編集(投稿者)

To.Azuleanさん

ありがとうございます。
db = gcnew array<data_b^>(259200);
の後に、
for(int i = 0;i < 259200;i++){
db[i] = gcnew data_b;
}
とすることでできました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板