[解決済み】クラスデータメンバー "::*" へのポインタ
2022-04-01 16:02:04
質問
私はこの奇妙なコードスニペットを見つけたのですが、うまくコンパイルできます。
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
return 0;
}
なぜ C++では、クラスの非静的データメンバへのこのポインタがあるのでしょうか? 何 この奇妙なポインタは、実際のコードではどのように使われるのでしょうか?
解決方法は?
それは、"pointer to member"です。次のコードは、その使い方を示しています。
#include <iostream>
using namespace std;
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
Car c1;
c1.speed = 1; // direct access
cout << "speed is " << c1.speed << endl;
c1.*pSpeed = 2; // access via pointer to member
cout << "speed is " << c1.speed << endl;
return 0;
}
については なぜ そうすることで、厄介な問題を解決するための、もう1つの間接的なレベルを提供することができます。しかし、正直なところ、私は自分のコードでそれを使う必要があったことはない。
編集する メンバーデータへのポインターの納得のいく使い道が、すぐには思いつきません。ポインタ・トゥ・メンバ関数は、プラガブル・アーキテクチャで使用することができますが、狭いスペースで例を作るのは、またしても私を打ち負かすことになります。ユーザーが選択したメンバ関数をオブジェクトに適用する前に、いくつかの前処理と後処理を行うApply関数を作ってみました。
void Apply( SomeClass * c, void (SomeClass::*func)() ) {
// do hefty pre-call processing
(c->*func)(); // call user specified function
// do hefty post-call processing
}
を囲む括弧は
c->*func
が必要なのは
->*
演算子の優先順位は、関数呼び出し演算子よりも低い。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み】なぜenumクラスはプレーンなenumより好ましいのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】'std::cout'への未定義の参照