問題タブ [pointer-to-member]
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++ - メンバーフィールドへのポインタの出力
メンバ フィールドへのポインタを含むいくつかのコードをデバッグしていたので、値を確認するためにそれらを出力することにしました。メンバーへのポインターを返す関数がありました。
私は使用してみましたcout
:
私は得1 and 0
た。struct
数字は(つまり is1
とy
is 0
)内のフィールドの位置を示していると思っていましたx
が、実際には出力された値は1
非 null ポインターと0
null ポインター用です。これは標準に準拠した動作だと思います (役に立ちませんが) - そうですか? さらに、準拠した C++ 実装が常に0
メンバーへのポインターを出力することは可能ですか? それとも空の文字列ですか?
最後に、意味のある方法でメンバーへのポインターを出力するにはどうすればよいですか? 私は2つの醜い方法を思いつきました:
より良い方法はありますか?
c++-cli - C ++/CLIのデータメンバーへのポインタ
たとえば、C ++/CLIでデータメンバーへのポインタを作成するにはどうすればよいですか。
c++ - メンバー関数へのポインターのデフォルト値に関するCRTP関連のコンパイラー・エラー
やあ、
CRTPベースの汎用ラッパーを作成して任意のライブラリ関数を呼び出すときに、理解しにくい問題が発生しました。問題を説明するための非常に単純化されたコードを次に示します。
すべてが意図したとおりにコンパイルおよび動作します。ただし、 :TDerived::Foo()
の2番目のパラメーターのデフォルト引数としてポインターを使用しようとすると、TBase::Call(...)
コンパイラーは構文エラーを出します...コンパイラーがコードを解析する方法に関連していて、まだ定義されていない(またはインスタンス化されていない)クラスの関数へのポインターを理解できないと感じています。ただし、TDerived
の3番目のパラメーターのデフォルト引数としてコンストラクターを呼び出すことは問題ありませんTBase::Call(...)
。誰かが私に何が起こっているのかについて明確な答えを与えることができますか?派生クラスMFPが受け入れられず、派生クラスのオブジェクトがデフォルトの引数として受け入れられるのはなぜですか?
ありがとう。
編集:コンパイラのエラー(MSVS2010コマンドラインコンパイラ):
TDerived_
これは構文エラーです。MFPのデフォルト引数のタイプとして認識されません。これに続いて他のエラーがあります。関数定義の形式が正しくないため、これらはすべて構文エラーです。それが私がそれを理解する方法です。
編集:基本的に、オブジェクトをデフォルトの引数として使用できる理由はわかりませんがTDerived_
、メンバー関数へのポインターをデフォルトの引数として使用することはできません。
編集:わかりました、これは今私を夢中にさせています。まず、typedef TBase< PValue, TDerived > TBase_;
指摘された通りに変更しました(ありがとうございます!)。実際、このコンパイラは2つの部分からなる解析を行わないため、MSVC++でのみコンパイルされます。つまり、codepad.org(g ++ 4.1.2を使用)ではコンパイルされませんでした。static void Call( PType /*pSomething*/, void(TDerived_::*pFunction)( void ) = &TDerived_::Foo, TDerived_ pDerived = TDerived_() )
次に、 codepad.orgで使用してみましたが、コンパイルされて正しく実行されました。だから私は今本当に混乱しています:人々はそれが正しくない理由を私に説明しました(そして私は「なぜ」を理解できませんでした(私の前の編集を参照してください))そして今それはg++がそれを正しくコンパイルすることがわかります...それはちょうどそれを意味しますかコードではなくMSVC++の問題?または、コードには標準の観点から問題があり(そして私はそれを見ることができません)、g ++はそれを「誤って」受け入れます(おそらく、私は思いません)?..ヘルプ?!
c++ - 不正な参照であるメンバへのポインタ?
私が持っているとしましょう:
コンパイラは、参照であるためメンバーのアドレスを取得できないと不平を言います。正確には:
セマンティックの問題: 参照型 'int &' のメンバー 'j' へのポインターへのメンバーを形成できません
これを行うのは無意味に思えることはわかっていますが、なぜそれができないのか疑問に思っています。
なぜこれが不可能なのですか?
c++ - メンバーへのポインター、型記述子、および参照
私は C++11 で型記述子プロジェクトに取り組んでいます。型記述子の仕事は、クラス内のすべてのメンバーの型、サイズ、およびオブジェクトのベースからのオフセットを知ることです。多重継承や仮想メソッドを持つオブジェクトはサポートしていないので、今のところこれをもっと簡単にしています。目標は、記述子を使用してオブジェクトをシリアル化および非シリアル化できるようにすることです。
これは、可変個引数テンプレート、メンバーへのポインター、および私がよく知らない C++ のその他の機能などの機能をいじるためのペット プロジェクトであるため、boost::archiving のようなものに向ける必要はありません。:)
実際にメンバーを登録する方法は、boost::python::class_ の方法とよく似ています。
残念ながら、今週初めに学んだように、C++ のポインターからメンバーへの機能は C++ の参照では使用できません: https://stackoverflow.com/a/8336479/1074536。たとえば、 &Foo::refToAndInt を使用します。
メンバーのオフセットを計算する方法に関しては、クラスが常に POD であるとは限らないため、マクロのオフセットを使用していません。
したがって、参照のオフセットを計算するためにメンバーへのポインターを使用できないため、次のことを試してみようと思いました。
しかし、別のスタック オーバーフロー スレッドで指摘されていますが、これは未定義の動作であり、明らかに LLVM ではクラッシュします。:(
前のメンバーのオフセットを取得し、そのサイズを追加してから、次のメンバーを整列させるために必要なパディングを何らかの方法で計算するようなことは避けたいと思います。
したがって、これらのトリックの両方を使用することはできず、offsetof は POD 専用です。私の他の恐ろしい提案とは別に、次に何を試すことができるかについて何か提案はありますか?
ありがとう!
c++ - Does C++ support member function references?
C++ permits function pointers and function references. It also permits pointers-to-member-functions.
But does it permit references-to-member-functions?
I can't seem to deduce the rules from the standard, and I've failed to make a program work with them.
c++ - Pointer-to-Member演算子を理解する
このプログラムをC++の練習帳からコピーしました。舞台裏で何が起こっているのですか?
期待される出力は次のとおりです。
合計=30合計=70
c++ - 非静的クラス メンバーへのポインターの明確化
クラスのメンバーへのポインタが必要な場合は、次のようにします
私の質問は、 & 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります。また、メンバーへのポインターは実際にはポインターではないと聞きました。誰かがそれを明確にできますか?
c++ - 共有オブジェクトからの外部クラス メンバーの呼び出し
hereとhereをたくさん読んだ後でも、コードを機能させることができません。問題は次のとおりです。
Fifo という 2 つのクラスがあります。
および別のクラス Process_Wrapper:
メンバー関数Process_Wrapper::GetOutputPortIDtoFifoMap
は、 class の初期化されたオブジェクトへのポインターを返しますFifo
。
Fifo
これで、クラスのヘッダーでコンパイルされてインクルードされた共有オブジェクト (.so) ができProcess_Wrapper
ました。つまり、.so ファイルはこれらのクラスへのインターフェイスを認識します。
Process_Wrapper
この .so ファイルを( )のメンバ関数から呼び出し、Process_Wrapper::function2
.so にポインタ - を渡しますthis
。したがって、共有オブジェクトはクラスに関するすべてを知っていると思いますProcess_Wrapper
。
.so ファイルで、メンバー関数を呼び出そうとしていますがProcess_Wrapper::GetOutputPortIDtoFifoMap
、明らかに機能しません。だから、私は試しました:
whereはオブジェクトp1->wptr
へのポインターをProcess_Wrapper
正しく返します。
私はここで迷っています。私はこの概念にまったく慣れていないため、例は質問に直接答えていません。どうすればそれを行うことができますか?
また、私は C++0x/C++11 を使用しているので、std::bind または mem__fun_ref を使用した解決策を (できれば) 教えてもらえますか?
編集:わかりました、質問を絞り込むことができると思います: classと、このクラスのインスタンスであるMyclass
objectがあります。にはメンバー関数があり、いくつかの引数を取り、タイプ のポインターを返します。通常の関数へのポインターとして使用できるように、別の関数に渡されるメンバー関数を抽出するにはどうすればよいですか。または、具体的には、メンバー関数へのバインドされたポインターから関数ポインターを抽出するにはどうすればよいですか?myobject
Myclass
PTRTYPE
Myclass
c++ - C++メンバー関数ポインター
私はC++で小さなゲームをしていて、クラスメンバーの関数ポインターを発見しています。それらを正しく機能させるためのアイデアはありませんが、これが私の試みです。
それらを実装する正しい方法について、良いアドバイスをいただけますか?
よろしくお願いします。