1. ホーム
  2. c++

[解決済み】クラスデータメンバー "::*" へのポインタ

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 が必要なのは ->* 演算子の優先順位は、関数呼び出し演算子よりも低い。