指向类数据成员“::\*”的指针

新手上路,请多包涵

我遇到了这个编译得很好的奇怪代码片段:

 class Car
{
    public:
    int speed;
};

int main()
{
    int Car::*pSpeed = &Car::speed;
    return 0;
}

为什么 C++ 有这个指向类的非静态数据成员的指针?这个奇怪的指针在实际代码中有 什么 用?

原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 706
2 个回答

它是一个“指向成员的指针”——下面的代码说明了它的用法:

 #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;
}

至于您 为什么 要这样做,它为您提供了另一个层次的间接性,可以解决一些棘手的问题。但老实说,我从来没有在自己的代码中使用过它们。

编辑: 我想不出一个令人信服的使用指向成员数据的指针。指向成员函数的指针可用于可插拔架构中,但再次在狭小的空间中生成示例让我失望。以下是我最好的(未经测试的)尝试 - 在将用户选择的成员函数应用于对象之前会执行一些前后处理的 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 周围的括号是必要的,因为 ->* 运算符的优先级低于函数调用运算符。

原文由 anon 发布,翻译遵循 CC BY-SA 3.0 许可协议

我喜欢 *& 运算符:

 struct X
{
    int a {0};
    int *ptr {NULL};

    int &fa() { return a; }
    int *&fptr() { return ptr; }
};

int main(void)
{
    X x;
    int X::*p1 = &X::a;     // pointer-to-member 'int X::a'. Type of p1 = 'int X::*'
    x.*p1 = 10;

    int *X::*p2 = &X::ptr;  // pointer-to-member-pointer 'int *X::ptr'. Type of p2 = 'int *X::*'
    x.*p2 = nullptr;
    X *xx;
    xx->*p2 = nullptr;

    int& (X::*p3)() = X::fa; // pointer-to-member-function 'X::fa'. Type of p3 = 'int &(X::*)()'
    (x.*p3)() = 20;
    (xx->*p3)() = 30;

    int *&(X::*p4)() = X::fptr;  // pointer-to-member-function 'X::fptr'. Type of p4 = 'int *&(X::*)()'
    (x.*p4)() = nullptr;
    (xx->*p4)() = nullptr;
}

事实上,只要成员是公开的或静态的,一切都是真的

原文由 mada 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题