なるほどなるほど。皆さんありがとうございます。それぞれ試してみます。
ところで、なぜ自分のやったやり方がコンパイルできたんでしょう?Blueさんもちょっ
と迷ったみたいですけど…
まあ、実行できればよしとすればいいですかね…?
String* moji[];
と
String* moji[] = new String*[ 7 ];
じゃだいぶ違うのに。
> なぜ自分のやったやり方がコンパイルできたんでしょう
String* moji[];
は宣言だけ。mojiの実体はつくられていません。
よって、それを使おうとすると実行時にエラーになります。
コンパイラは文法的に間違っていないかをみてエラーを出します。
String* moji[] = new String* [7]; が上手くいきました。
皆さんありがとうございます。一応解決にはしておきますけど最後の質問(なぜコンパ
イルできたか?)が分かればのせてください。またなにかあったらお力添えをお願いし
ますm(__)m
んと。
まず、Managed C++ は .NET Framework の上で動きます。
.NET Framework の上では、全ての型は参照型と値型に分けられます。
参照型ってのは C で言えばポインタのようなもので、new しなければ使えません。
値型は変数宣言すれば使えます。
さて、.NET Framework における配列は、System::Array クラスのオブジェクトで、これ
は参照型です。
C++ では、
CString moji[ 7 ];
と書けば、何も new しなくても配列が作成されましたが、.NET Framework では、
System::String * moji[];
では、「System::String * の配列のポインタ」を宣言したのと同じことで、まだ実体が
ありません。
そこで、new してやらなければいけません。
ついでに、
System::String * moji[ 7 ];
が通らない理由ですが、C++ では、配列の要素数まで含めて型の一部なので、
CString moji[ 7 ];
と
CString moji[ 8 ];
は別の型です。
しかし、前述したように、.NET Framework における配列は System::Array クラスとい
う単一の型であり、要素数は、その型が持つプロパティの一つに過ぎません。つまり、
配列の要素数は型の一部ではありません。
そのため、「一旦要素数なしの変数を宣言して、要素数はあとから指定」する必要があ
ります。
STL について知っているのならば、.NET Framework の配列は std::vector のようなも
のだと考えてください(ただし、vector は可変長ですが、System::Array は固定長で
す)。
vector では要素数が型の情報の一部ではないため、こういうコードが書けます。
std::vector<int> & rvi10 = std::vector<int>(10);
std::vector<int> & rvi15 = std::vector<int>(15);
要素数は違いますが、同じ std::vector< int > という型で受けることができます。
System::Array はこれに似ています。
C++ の配列では、要素数が型の一部であるため、
int ri10[ 10 ];
int ri15[ 15 ];
/*
int (&rri)[] = ri10; // コンパイルエラー
int (&rri)[] = ri15; // コンパイルエラー
*/
int (&rri10)[10] = ri10;
int (&rri15)[15] = ri15;
こうしないと通りません。