C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: インデクサについて


(過去ログ 62 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■36128 / inTopicNo.1)  インデクサについて
  
□投稿者/ プリ太 (15回)-(2009/05/21(Thu) 15:26:25)

分類:[C#] 

プリ太です。

環境WinXP+VS2005です。

数値をまとめて管理するのにインデクサを使おうとしています。
インデクサの宣言は
public class cItemPos_Timing
{
int[] array;
public cItemPos_Timing(int i)
{
//配列の作成
this.array = new int[i];
}
//インデクサ
public int this[int i]
{
get
{
return this.array[i];
}
set
{
this.array[i] = value;
}
}
}
としています。
このクラスの型の変数timingを他のクラスpStの中で宣言し、サイズを4で宣言しています。

その後、変数timingに値を設定しようとして、
pSt.timing[0] = 45;
とすると、「エラー 431 型 'int' を型 'cItemPos_Timing' に暗黙的に変換できません。」
とエラーメッセージが表示されます。
配列はint型で宣言しているのでそのまま値を設定できると思ったのですが、違うのでしょうか?

また、同じように2次元配列のインデクサも作成してみたのですが、同じように値を設定しようとするとエラーが出ます。
インデクサに値を設定する時はそのままではダメなのでしょうか?

宜しくお願いします。

引用返信 編集キー/
■36129 / inTopicNo.2)  Re[1]: インデクサについて
□投稿者/ みきぬ (434回)-(2009/05/21(Thu) 15:35:57)
No36128 (プリ太 さん) に返信
> このクラスの型の変数timingを他のクラスpStの中で宣言し、サイズを4で宣言しています。
>
この宣言をどうやってるか書いてほしかった。たぶん、↓こんな風に書いたんだと思う。

cItemPos_Timing[] timing = new cItemPos_Timing[4];

これだと、timing は cItemPos_Timing の配列として宣言されてるので記載のエラーが出たというわけ。
↓こう直せばいいんじゃないかな。

cItemPos_Timing timing = new cItemPos_Timing(4);


引用返信 編集キー/
■36130 / inTopicNo.3)  Re[2]: インデクサについて
□投稿者/ プリ太 (16回)-(2009/05/21(Thu) 15:50:42)
みきぬ さん、ありがとうございます。


>>このクラスの型の変数timingを他のクラスpStの中で宣言し、サイズを4で宣言しています。
>>
> この宣言をどうやってるか書いてほしかった。たぶん、↓こんな風に書いたんだと思う。
>
> cItemPos_Timing[] timing = new cItemPos_Timing[4];
>
> これだと、timing は cItemPos_Timing の配列として宣言されてるので記載のエラーが出たというわけ。
> ↓こう直せばいいんじゃないかな。
>
> cItemPos_Timing timing = new cItemPos_Timing(4);

timingはcItemPos_St型クラスで宣言していて、
public cItemPos_Timing[] timing;
でと記述しています。
サイズの指定はcItemPos_Stクラスを宣言した、cItemPos_Allクラスのコンストラクタ中で以下のように記述しています。。
pSt.timing = new cItemPos_Timing[4];

これだと、みきぬさんの書かれたコードと同じことになると思うのですが、違うのでしょうか?
ちなみに、cItemPos_Stは格納する変数のみを格納したクラスです。
cItemPos_Allクラスの中では値格納用のクラスを変数宣言して、値を設定しています。
引用返信 編集キー/
■36131 / inTopicNo.4)  Re[3]: インデクサについて
□投稿者/ Hongliang (385回)-(2009/05/21(Thu) 16:20:18)
> timingはcItemPos_St型クラスで宣言していて、
> public cItemPos_Timing[] timing;
cItemPos_Timing の配列を宣言していますね。
> pSt.timing = new cItemPos_Timing[4];
でまあ当然ですが cItemPos_Timing の配列として timing を初期化しています。
// みきぬさんの前者の方のコードですね。
「cItemPos_Timing の配列」の、それぞれの要素の型は当然 cItemPos_Timing ですよね。
だから pSt.timing[n] に代入するのは cItemPos_Timing となります。

cItemPos_Timing 自体は一つしかいらなくて、cItemPos_Timing が管理する int の配列がほしいんでしたら、cItemPos_Timing[] じゃなくて cItemPos_Timing を宣言して初期化しないといけませんよね?
引用返信 編集キー/
■36132 / inTopicNo.5)  Re[4]: インデクサについて
□投稿者/ プリ太 (17回)-(2009/05/21(Thu) 16:30:08)
Hongliang さん、ありがとうございます。


>>timingはcItemPos_St型クラスで宣言していて、
>> public cItemPos_Timing[] timing;
> cItemPos_Timing の配列を宣言していますね。
>> pSt.timing = new cItemPos_Timing[4];
> でまあ当然ですが cItemPos_Timing の配列として timing を初期化しています。
> // みきぬさんの前者の方のコードですね。
> 「cItemPos_Timing の配列」の、それぞれの要素の型は当然 cItemPos_Timing ですよね。
> だから pSt.timing[n] に代入するのは cItemPos_Timing となります。
>
> cItemPos_Timing 自体は一つしかいらなくて、cItemPos_Timing が管理する int の配列がほしいんでしたら、cItemPos_Timing[] じゃなくて cItemPos_Timing を宣言して初期化しないといけませんよね?

宣言部分を以下に変更したところ、値の設定ができるようになりました。
cItemPos_St型クラスの宣言:public cItemPos_Timing timing;
cItemPos_Stクラスのサイズ指定:pSt.timing = new cItemPos_Timing(4);

配列に値を入れるので、元々の宣言を配列型にしていたため、値がそのままではないらなかったということが解りました。
また、初期化なので"[]"ではなく"()"でした。
二重で間違えていました。

実行したところ、値を設定することができました。
ありがとうございました。
引用返信 編集キー/
■36133 / inTopicNo.6)  Re[5]: インデクサについて
□投稿者/ プリ太 (18回)-(2009/05/21(Thu) 16:30:42)
すみません。解決にチェックするのを忘れていました。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -