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

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

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

Re[4]: operator()に代わるもの


(過去ログ 57 を表示中)

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

■32227 / inTopicNo.1)  operator()に代わるもの
  
□投稿者/ 沙希 (1回)-(2009/02/03(Tue) 17:30:41)

分類:[C#] 

C#にC++でいうoperator()に代わるものはあるのでしょうか?
下記にC++でoperator()を使ったソースを記載しますので、
これをC#で書き直すとそうなるか教えていただけませんでしょうか?

template< class T > class Array2D{
public:
	T& operator()( int index0, int index1 ){
		return mArray[ index1 * mSize0 + index0 ];
	}
	const T& operator()( int index0, int index1 ) const {
		return mArray[ index1 * mSize0 + index0 ];
	}
private:
	T* mArray;
	int mSize0;
	int mSize1;
};

またtemplateはジェネリックを使えば代わりになるのですよね?
public class Array2D<T>
{
}
これでいいのでしょうか?
どなたかご教授ください。




引用返信 編集キー/
■32228 / inTopicNo.2)  Re[1]: operator()に代わるもの
□投稿者/ επιστημη (1648回)-(2009/02/03(Tue) 17:37:39)
επιστημη さんの Web サイト
2009/02/03(Tue) 17:39:58 編集(投稿者)
> C#にC++でいうoperator()に代わるものはあるのでしょうか?

インデクサ:[] がいちばん近いかしら。

 public T this[int i, int j] { 
    get { よみだす }
    set { かきこむ }
 }

> またtemplateはジェネリックを使えば代わりになるのですよね?

ならんこともあります。

引用返信 編集キー/
■32230 / inTopicNo.3)  Re[2]: operator()に代わるもの
□投稿者/ 沙希 (2回)-(2009/02/03(Tue) 17:49:52)
επιστημη さん 回答ありがとうございます。

インデクサですか、、
こんな感じでいいんでしょうか?
 public T this[int i, int j] { 
    get { return mArray[ j * mSize0 + i ]; }
    set { mArray[ j * mSize0 + i ] = value; }
 }
呼び出すときはどうすればいいんですか?
また、ジェネリックがtemplateの代わりにならないことにはどういうときなのでしょうか?

あと、C++ではコンストラクタを使って、
変数に何か初期値を入れる時下記のような書き方ができますよね?
template< class T > class Array2D{
public:
	Array2D() : mArray( 0 ){}
private:
	T* mArray;
};
C#でもこういった書き方はできるのでしょうか?

引用返信 編集キー/
■32231 / inTopicNo.4)  Re[3]: operator()に代わるもの
□投稿者/ επιστημη (1649回)-(2009/02/03(Tue) 17:58:15)
επιστημη さんの Web サイト
2009/02/03(Tue) 18:04:21 編集(投稿者)
> インデクサですか、、
> こんな感じでいいんでしょうか?
>...
> 呼び出すときはどうすればいいんですか?

Array2D<double> a2 = new Array2D<double>();
....
a2[2,3] = 5.4;      // とか
double v = a2[0,3]; // なんとか

> また、ジェネリックがtemplateの代わりにならないことにはどういうときなのでしょうか?

Array2D<T> 内の各要素を factor倍するメソッド void multiplies(T factor) を定義してみそ。
きっとえらい苦労するはず。諦めちゃうかも。
templateならさっくりできちゃうのに。

> 変数に何か初期値を入れる時下記のような書き方ができますよね?
> ...
> C#でもこういった書き方はできるのでしょうか?

基本事項なので教本を読んでください。

引用返信 編集キー/
■32233 / inTopicNo.5)  Re[4]: operator()に代わるもの
□投稿者/ 沙希 (4回)-(2009/02/03(Tue) 18:24:11)
επιστημη さん 回答ありがとうございます。

インデクサについては理解できました。
ありがとうございます。

ジェネリックがtemplateの代わりにならない時はよくわからないです、、

初期化については、
下記のようにできるのは理解できるのですが、
public void Array2D()
{
   mArray = 0;
}
C++でいう下記のような書き方はできないのでしょうか?
public:	Array2D() : mArray( 0 ){}



引用返信 編集キー/
■32237 / inTopicNo.6)  Re[5]: operator()に代わるもの
□投稿者/ 沙希 (5回)-(2009/02/03(Tue) 18:48:14)
下記のように書くと、

  public class Array2D<T>
    {
        private T* mArray;
        private int mSize0;
        private int mSize1;

        public void Array2D()
        {
            mArray = 0;
        }

        public T this[int index0, int index1]
        {
            get { return mArray[index1 * mSize0 + index0]; }
            set { mArray[index1 * mSize0 + index0] = value; }
        }
    }

エラー	1   ポインタおよび固定サイズ バッファは、unsafe コンテキストでのみ使用することができます。
エラー	2   'Array2D': メンバ名をそれを囲む型の名前と同じにすることはできません。

というエラーがでます。
どうすればよいでしょうか?



引用返信 編集キー/
■32238 / inTopicNo.7)  Re[6]: operator()に代わるもの
□投稿者/ επιστημη (1650回)-(2009/02/03(Tue) 19:50:17)
επιστημη さんの Web サイト
> エラー 1 ポインタおよび固定サイズ バッファは、unsafe コンテキストでのみ使用することができます。
> エラー 2 'Array2D': メンバ名をそれを囲む型の名前と同じにすることはできません。
>
> というエラーがでます。
> どうすればよいでしょうか?

1. C#でポインタは使いません。
2. コンストラクタにvoidつけちゃいけません。

教本読んで勉強してください。

引用返信 編集キー/
■32239 / inTopicNo.8)  Re[7]: operator()に代わるもの
□投稿者/ aetos (91回)-(2009/02/03(Tue) 19:52:14)
aetos さんの Web サイト
No32233 (沙希 さん) に返信
> ジェネリックがtemplateの代わりにならない時はよくわからないです、、

C++ にない概念として、制約があります。
「型引数(<T> とか書くやつ)は、特定のインターフェイスを実装していなければならない」みたいな。
型引数をインターフェイスで制約した場合、その型引数にはそのインターフェイスを実装する型しか渡せない代わりに、
そのインターフェイスを実装していると仮定することができます。
制約のない型に対しては、object 型であることしか仮定できません。

例を出しますか。
Array2D<T> の各要素を何倍かするメソッド void Multipies( double factor ) を考えます。
# T factor だと、また別の意味で難しいような…>えぴさん
これを、

void Multiplies( double factor )
{
  for( int i = 0; i < mArray.Length; ++i )
  {
    mArray[ i ] *= factor;
  }
}

と書くことはできません。
mArray[ i ] の型は T ですが、これが制約されていなければ、T は object 型にできることしか許されず、object 型に * 演算は不可能だからです。
仮に operator * を宣言した IMultipliable があれば、where T : IMultiplable と制約することで、* 演算ができる、と思ってください。
その代わり、今度は掛け算できる型しか Array2D に入れることができなくなります。
(実際には、C# では operator は static であり、interface は静的メンバを宣言できないので、演算子の制約は書けません)。
C++ では、T が IMultipliable を実装していなくとも、2項 operator * を持っていれば、上記のコードがコンパイルできます。

制約も便利な面はあるのですが、このようなデメリットもあります。

> C++でいう下記のような書き方はできないのでしょうか?
> public:	Array2D() : mArray( 0 ){}

できませんしする必要もありません。
どうしてこの書き方にこだわるのですか?

引用返信 編集キー/
■32241 / inTopicNo.9)  Re[1]: operator()に代わるもの
□投稿者/ NyaRuRu (83回)-(2009/02/03(Tue) 20:35:27)
2009/02/03(Tue) 20:41:00 編集(投稿者)
2009/02/03(Tue) 20:39:24 編集(投稿者)

No32227 (沙希 さん) に返信
> またtemplateはジェネリックを使えば代わりになるのですよね?

他の方も書かれているように,完全な代替物ではありません.
以下のスライドで .NET Generics の設計者の一人である Andrew Kennedy さんがその辺の背景事情を説明されています.
http://research.microsoft.com/~akenn/generics/FOOL2003.ppt
まず 1960 年代から続く Parametric Polymorphism の背景があります.
そして .NET Generics はそのゴールとして「Simplicity」「Consistency」「Separate Compilation」を念頭においてデザインされた,とあります.
C++ template との互換性/からの発展性が特別扱いされているわけではありません.
当然のことながら,.NET Generics にはできて,C++ template にはできないこともあります.

C++ template との比較や変な混同があまりにも多い理由は,
・C# generics が,C++ template とよく似たシンタックスを採用している
・多くのプログラマは Parametric Polymorphism の実例として C++ template しか知らないため,これ以外に例を出しにくい
あたりじゃないかと思います.
引用返信 編集キー/
■32247 / inTopicNo.10)  Re[2]: operator()に代わるもの
□投稿者/ 沙希 (6回)-(2009/02/03(Tue) 22:13:44)
2009/02/03(Tue) 22:14:37 編集(投稿者)

皆様、沢山のご教授ありがとうございます。
その中でまだ解決していないことがあるのですが、
private T* mArray;
という風なポインタはC#では使えないとありますが、
では、C#で私がC++で書いたようなことを実現するにはどうすればよいのでしょうか?
引用返信 編集キー/
■32248 / inTopicNo.11)  Re[3]: operator()に代わるもの
□投稿者/ 囚人 (314回)-(2009/02/03(Tue) 22:31:51)
>では、C#で私がC++で書いたようなことを実現するにはどうすればよいのでしょうか?

違いはまぁありますけど、とりあえず
private T mArray;
って書いとけば、いいかな。


引用返信 編集キー/
■32249 / inTopicNo.12)  Re[3]: operator()に代わるもの
□投稿者/ Azulean (282回)-(2009/02/03(Tue) 22:32:34)
> private T* mArray;
> という風なポインタはC#では使えないとありますが、
> では、C#で私がC++で書いたようなことを実現するにはどうすればよいのでしょうか?

参照型であれば、private T mArray;とでも。
値型は無理です。

参照型、値型が分からないのであれば、今度こそ教本を手に取っていただきたい。

何でも聞いて解決するより、まとめて勉強した方が早いですよ、きっと。
曖昧な理解のまま鵜呑みにしてコードを書くと、後で酷い目に遭いますから、自分で変換できるぐらいの知識を身につけて頂きたい。
引用返信 編集キー/
■32255 / inTopicNo.13)  Re[3]: operator()に代わるもの
□投稿者/ επιστημη (1651回)-(2009/02/03(Tue) 23:39:33)
επιστημη さんの Web サイト
2009/02/04(Wed) 00:05:02 編集(投稿者)

> private T* mArray;
> という風なポインタはC#では使えないとありますが、
> では、C#で私がC++で書いたようなことを実現するにはどうすればよいのでしょうか?

private T[] mArray;
あるいは
private List<T> mArray;
かな。

とにかく教本をひとわたり読んでホスイ

引用返信 編集キー/
■32261 / inTopicNo.14)  Re[4]: operator()に代わるもの
□投稿者/ Jitta (572回)-(2009/02/04(Wed) 08:31:35)
No32255 (επιστημη さん) に返信
> 2009/02/04(Wed) 00:05:02 編集(投稿者)
>
>>private T* mArray;
>>という風なポインタはC#では使えないとありますが、
>>では、C#で私がC++で書いたようなことを実現するにはどうすればよいのでしょうか?
>
> private T[] mArray;
> あるいは
> private List<T> mArray;
> かな。
>
> とにかく教本をひとわたり読んでホスイ
>

「マニュアル読め」っつってるのに教えてもらうことに固執して失敗した例
http://bbs.wankuma.com/index.cgi?mode=al2&namber=31995
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -