• 締切済み

C#のdelegateをC++とjavaで?

επιστημη(@episteme)の回答

回答No.4

> [&obj1](int x, int y){ return obj1.add(x,y);}は、 > 新たに、ラムダ式のようなものを作って、 > delgに指定してるようにみえるです "ようなもの"じゃなく、これがC++のラムダ式です。 > obj1のaddを直で、取得し、その上記の型の変数や引数で > 受けることは。 > C++の標準的な構文では、不可能なのでしょうか? 直接取得するのは無理。あえてやるなら #include <iostream> #include <functional> using namespace std; class foo { int base; public: explicit foo(int b) : base(b) {} int add(int x, int y) const { return base + x + y; } // ↓ラムダ式を返すメソッド function<int(int,int)> add_delg() const { return [this](int x, int y) { return add(x,y); }; } }; int main() { function<int(int,int)> delg; // delegate int delg(int,int) foo obj1(1); foo obj2(2); delg = obj1.add_delg(); cout << delg(2,3) << endl; delg = obj2.add_delg(); cout << delg(2,3) << endl; }

meviusjp
質問者

補足

素晴らしいです。 なんでもできるんですね。 天才的な人だ。 add_delg みたいなのが、まさに、それ。 C#の場合は、メソッドそのものが、 直でdelegateに指定できて、 メソッドそのものが、もう デリゲードそのもののように 見えるんですが。 C++では、 ラムダ式の形をとらないと。 『どのインスタンス』か? という情報をもったものを 取得する手段がないということですか。 [this]という構文が このインスタンスです、といって、 そのロジックが、 (int x,int y) { return add(x,y);} ですといってようです。 昔、メンバー関数を、関数ポインタに 指定しようとして、 コンパイラに怒られて、 あぁ、無理なのか。 そういえば、メンバー関数は どのインスタンスか? という情報もあるし。 別物なんだろなと、 思ってたです。 メンバー関数に、直でコールバックするのってどうするんだろ。 って、おもったまま、 今回の回答をもらうまで、 ずっと、わからなかったです。  functin<int(int,int)> 中身がどうなってるか 不思議だけど、 勉強になったです。

関連するQ&A

  • Cに慣れてしまった人、どのようにJAVAを克服しましたか?

    JAVAについて質問です。 私はC言語をこの1年間勉強してきました。 そしてC言語のコーディングの仕方に慣れきってしまったせいか、どうしてもJAVAのオブジェクト指向 というものが理解できません。 コーディングも上手くいきません。 クラスやメソッドやインスタンスがどうとかコンストラクタが・・・などの横文字が全然意味が分かりません。 C言語で言うとどれがどこに当たるのか!? とかいう風に置き換えて考えようとしても上手く行きません。 こういう、横文字が理解できて、オブジェクト指向の考え方に慣れる為にはどのようにしたらいいでしょうか? また、C言語からプログラミングに入って、後からJAVAを勉強する場合、どのような点に気をつければ良いでしょうか? また、JAVAの克服法を教えてください。

    • ベストアンサー
    • Java
  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java
  • javaに"search"という関数 or メソッドはあるのでしょうか?

    javaに"search"という関数 or メソッドはあるのでしょうか? webサイトで探しても見つかりません。 出てくるのはExcelのsearch関数が出てきます。 もし、Javaに"search"関数 or メソッドがあるならば、どのような 機能(働き)なのでしょうか? Javaで"search"を見かけたのは、 こういった文です。 *********************************** AAA:クラス a:インスタンス(オブジェクト) b:インスタンス(オブジェクト) eee:データベースのPrimaryキー fff:データベースのPrimaryキー AAA a = b.serch(eee, fff); if(a = null) { ・・・・・省略・・・・・ } ************************************ また、searchについてwebサイトがあれば 教えて頂きたいのですが、 どなたか宜しくお願いします。

    • ベストアンサー
    • Java
  • JavaからCへ

    僕は今までJavaを勉強していたのですが、 つい最近になって、C言語に手をつけ始めました。 Javaを知っていればC言語は結構とっつきやすいのではないかと思って始めたのですが、Javaに慣れすぎたせいか、C言語の文法がどうもしっくりきません。 特に関数あたりが・・・・。 C言語の関数って、Javaでいうところのメソッドですよね? 僕はそのように解釈しているのですが、あまり自信がないので、ご存知の方がいましたらどなたか教えてください。 あと、Javaを学習した人のためのC言語の本、もしくはC言語を学んだ人のためのJavaの本がありましたら教えてください。

    • ベストアンサー
    • Java
  • JAVAでCの関数ポインタのようなことをするには?

    CのプログラムをJAVAに移植しています。関数ポインタのプログラムを移植したいのですがやり方がよく判りません。interfaceを実装するとできるようですが・・・ 以下のCプログラムをJAVAに移植する方法を教えてください。 #include <stdio.h> int func(int , int); int main() { int (*po)(int , int) , i; po = func; i = (*po)(10 , 3); printf("%d" , i); return 0; } int func(int i , int j) { return i + j; }

    • ベストアンサー
    • Java
  • JNAで関数ポインタの表し方

    JNAで関数ポインタの表し方 JNAを利用してC言語の関数をJavaで利用したいのですが、その関数の引数に関数ポインタが含まれていて、使い方が分かりません。 関数ポインタ型のJavaのマッピングはどうすればいいのでしょうか? つまりJavaの特定のメソッドをその関数内からコールバックさせたいです。

  • c# インターフェイスの実装の確認

     こんにちは。c#初心者です。  EqualityComparer<T>.DefaultプロパティはT型がIEqualityComparer<T>インターフェイスを実装しているか確認する操作を含むようですが、それと同じようにインスタンスなしでT型が特定のインターフェイスを実装しているかどうか確認したいのですが、可能なのでしょうか?  どなたか詳しい方がいらっしゃいましたら教えてください。

  • ADODB.Connectionはインターフェイス

    いつもお世話になっております。 C#で特定のDBに接続するクラスを作ろうとADODB.Connection(ADO.Conn)を継承しようとしたところADO.Connはインターフェイスであるため、各メンバの実装をしなくてはなりません。ADO.Connはオブジェクトととしてインスタンスを生成できていたため、なぜインターフェイスがインスタンスを生成してオブジェクトとして使えるのかがわかりません(Excel.Applicationなども同様です)。 これはどのような仕組みになっているのでしょうか?

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java