問題タブ [member-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メンバー関数へのポインターの実際の使用法は何ですか?
私はこの記事を読みましたが、メンバー関数へのポインターを呼び出すときは、インスタンス(1つへのポインターまたはスタック参照のいずれか)が必要であり、次のように呼び出すことができます。
私の質問はこれに基づいています:インスタンスがあるので、次のようにメンバー関数を直接呼び出してみませんか?
メンバー関数へのポインターの合理的/実用的な使用法は何ですか?
[編集]
私はX-developmentで遊んでいて、ウィジェットを実装する段階に達しました。Xイベントをクラスとウィジェットに変換するためのevent-loop-threadは、それらのイベントが到着したときに、各ウィジェット/ウィンドウのスレッドを開始する必要があります。これを適切に行うには、クラスのイベントハンドラーへの関数ポインターが必要だと思いました。
そうではありません。私が発見したのは、仮想基本クラスを使用するだけで、同じことをはるかに明確でわかりやすい方法で実行できるということでした。メンバー関数へのポインタはまったく必要ありません。上記を開発しているときに、メンバー関数へのポインターの実用性/意味について疑問が生じました。
member-function-pointerを使用するためにインスタンスへの参照が必要であるという単純な事実は、インスタンスの必要性を廃止します。
[編集-@sbiなど]
これが私のポイントを説明するためのサンプルプログラムです:(特に'Handle_THREE()'に注意してください)
{編集]上記の例の直接呼び出しに関する潜在的な問題:
Handler_THREE()では、メソッドの名前をハードコーディングする必要があります。メソッドに変更を適用するには、メソッドが使用されている場所で変更を強制します。メンバー関数へのポインターを使用して行われる唯一の追加の変更は、ポインターが作成される場所です。
[編集]回答から収集した実用的な使用法:Chubsdadによる
回答
から:内容:
専用の「呼び出し元」関数を使用してmem-func-ptrを呼び出します。利点:他のオブジェクトによって提供される関数を使用してコードを保護する方法:特定の関数が多くの場所で使用され、名前やパラメーターが変更された場合、割り当てられた名前を変更するだけで済みます。ポインタを指定し、「呼び出し元」関数で呼び出しを調整します。(関数をinstance.function()として使用する場合は、どこでも変更する必要があります。)
Matthew Flaschenによる回答から:内容:
クラスのローカルスペシャライゼーション
利点:コードをはるかに明確、シンプル、使いやすく、保守しやすくします
方法:複雑なロジックを使用して従来実装されていたコードを(潜在的に)大きなswitch()/ifに置き換えます-次に、スペシャライゼーションへの直接ポインタを含むステートメント。上記の「発信者」関数とかなり似ています。
c++ - コンパイル時にクラスに特定のメンバー関数が含まれているかどうかを確認する方法
2つのクラスがあるとします:
次の関数でタイプ A または B のオブジェクトを使用したい
さて、たくさんのクラスがあり、GetInt() を含むものも含まないものもあります。型ごとに特殊化を記述したくありません。' GetInt() を含むか、コンパイル時に含まないかで区別したいだけです。 '、どうすればいいですか?
c++ - メンバー関数テンプレートを配置する場所
定期的に私を苛立たせるC++の側面は、テンプレートがヘッダーファイル(従来はインターフェイスを記述している)と実装(.cpp)ファイルの間のどこに収まるかを決定することです。多くの場合、テンプレートはヘッダーに含める必要があり、実装を公開し、以前は.cppファイルに含める必要があった余分なヘッダーをプルすることもあります。最近、この問題が再び発生しました。その簡単な例を以下に示します。
実際のクラスを基本クラス、つまり仮想デストラクタとして使用するつもりであることに注意してください。それが重要かどうかは疑わしいですが、念のためカウンターに置いておきました。上記の結果の出力は次のとおりです。
Counter
これで、のクラス宣言はすべてヘッダーファイル(例:counter.h)に入れることができます。iostreamを必要とするdtorの実装をcounter.cppに入れることができます。countAndPrint()
しかし、iostreamも使用するメンバー関数テンプレートをどうすればよいでしょうか。コンパイルされたcounter.oの外部でインスタンス化する必要があるため、counter.cppでは使用できません。しかし、counter.hに入れるということは、counter.hを含むすべてのものにiostreamも含まれることを意味します。これは、間違っているように見えます(そして、私はこの嫌悪感を乗り越えなければならないかもしれないことを受け入れます)。テンプレートコードを別のファイル(counter.t?)に入れることもできますが、それはコードの他のユーザーにとっては少し意外なことです。Lakosは、私が望むほど実際にはこれに触れていません。C++ FAQベストプラクティスにはなりません。だから私が求めているのは:
- コードを私が提案したものに分割するための代替手段はありますか?
- 実際には、何が最も効果的ですか?
c++ - C++: クラス外から public メンバー関数へのアクセス
別のファイルで定義されたクラスがあり、ある時点で、別のソース ファイルからパブリック メンバー関数の 1 つにアクセスする必要があります。何らかの理由で、その方法を忘れてしまい、コンパイラーがエラーを出してしまいました。
次のようなクラス A の定義を持つ classA.h があります。
そして、実装を含む別のファイル classA.cpp 。そして、他のファイル blah.cpp にヘッダーを含めて、次のようにアクセスしようとします。
私のコンパイラは、「classA::function1(int)」に一致するものが見つからないというエラーで拒否します。
それが問題になる場合は、Embarcadero RAD studio 2010 を使用します。
c++ - クラスメソッドでインスタント依存の静的変数を作成するにはどうすればよいですか?
クラスに関数があり、多かれ少なかれ次のように機能します。
次のように、複数のプレーヤーを使用しようとすると問題が発生します。
o1
はplayerone.minions[0]
予想どおり にo2
ありますが、は同じ変数を使用playerthree.minions[1]
する関数の にあります。関数が単一のインスタンスに静的変数を使用するようにする方法はありますが、インスタンスごとに個別の変数を使用しますか? equal toの最初の場所へのループを作成したり、のメンバーを直接作成したりできることはわかっていますが、これらのいずれかを実行する前に、より良い方法があるかどうかを知りたいです。Summon()
i
Summon()
i
i
for
minions[]
NULL
i
Player
javascript - javascriptオブジェクトの関数/メソッドを一覧表示する方法は?(それも可能ですか?)
この質問は、意図的に この質問のように表現されています。
これが可能かどうかさえわかりませんが、JSで列挙できないいくつかのプロパティについて漠然と聞いたことを覚えています。
とにかく、簡単に言うと、ドキュメントがなく、コードに簡単にアクセスできないjsフレームワークで何かを開発しているので、オブジェクトで何ができるかを知るのに非常に役立ちます。
c++ - C++でまだ定義されていない別のクラスのメンバー関数であるフレンドを宣言する方法は?
B のコンストラクターを A のフレンドとして宣言するにはどうすればよいですか? 私は試した:
c# - C#では、プラグインを介してプライベートまたはパブリック関数をオーバーライドする方法はありますか?
プラグインをロードするアプリケーションがあります。フォーム インスタンスに完全にアクセスできるプラグインがあります。オーバーライドする必要があるフォームに関数があるが、仮想関数ではない場合、それをオーバーライドする別の方法はありますか?
非常に一般的な例を次に示します。
...次に、別のdllで...
この例では、フォームの関数は「myVariable1」を設定しますが、プラグインの「setVar」関数は「myVariable2」を設定します。
問題は、この例の場合、フォームの「setVar」関数をプラグインの関数で置き換え/オーバーライドできるかということです。多分メッセージや反射で?
c++ - thiscall 規則を使用した C++ メンバー関数の呼び出し
Delphi で記述された DLL をロードする C++ で記述されたアプリケーションがあります。アプリケーションは、DLL のエクスポートされた関数を呼び出し、Delphi DLL から呼び出したいいくつかのメンバ関数を持つクラスのオブジェクトへのポインタを渡します。C++ クラスに相当する Delphi クラスを作成しました。
C++クラスは同じように見えます
メンバ関数は、Delphi に相当するものがない thiscall 呼び出し規約を使用します。これはおそらく、アセンブリを使用する必要があることを意味します。私が試してみました:
しかし、アプリケーションがこの関数を呼び出すと、セグメンテーション違反が発生します。メンバー関数を正しく呼び出すにはどうすればよいですか?
c++ - 非静的メンバー関数のデフォルト引数としての非静的メンバー
これが C++ で違法である理由を 1 つだけ教えてもらえますか?! つまり、エラーであることはわかっています。エラーの意味はわかっていますが、なぜこれが違法なのか理解できません。