我认为这对于函数而不是可变成员更有用,但是同样的原则适用于两者。假设我有一个具有3个函数的类,它可以完成一件事,它依赖于你正在运行的处理器(比如INTEL与AMD,或者支持SSE4的处理器,而只有SSE2的旧处理器......)
void renderCPU();
void renderSSE2();
void renderSSE3();
void renderSSE4();
然后你会拿这些函数的指针,使用指针,而不是测试你是否有SSE4,SSE3,SSE2,或CPU要渲染各一次。
// in constructor
if (SSE4) render_ptr = &C::renderSSE4;
else if (SSE3) render_ptr = &C::renderSSE3;
else if (SSE2) render_ptr = &C::renderSSE2;
else render_ptr = &C::renderCPU;
// And in the render function:
this->*render_ptr();
对于可变成员,类似的事情可能发生,虽然坦白说,我从来没有使用过,对于一个变量,可能是因为你还可以使用直指针(在你的榜样,即一个“诠释*” ......)虽然我想这是一个好主意,使用类指针来增加安全性。
现在我回想起来,使用带有公共常量引用指针的类来指向一个私有变量成员。实际上,它给用户一个getter()而不必实际调用一个函数。这种技术的一个问题是参考文献被锁定在施工上。
class P
{
private:
int v_;
public:
const int& value;
p()
: value(v_) // locked...
{
}
};
类变量指针允许您在使用该对象时更改指针。
class P
{
private:
int x_;
int y_;
int z_;
public:
const int P::*ref;
p()
: ref(&P::x_) // not locked...
{
}
void modeX()
{
ref = &P::x_;
}
void modeY()
{
ref = &P::y_;
}
void modeZ()
{
ref = &P::z_;
}
};
有了这样一个类,你应该能够做这样的事情:
P p;
cout << p.*p.ref; // write x_
p.modeZ();
cout << p.*p.ref; // write z_
这使得“价值”相当安全,而不是裸指针。
还要注意的是给你写以下的能力:
P p, q;
p.*q.ref = q.*p.ref;
这可能是某些人有用...
什么时候?我会说约0.001%的时间。除非你使用一个需要指向成员变量的API的库。现在设计API可以更方便地使用访问成员的lambda表达式,而不是专门用来获取指向成员变量的指针。 – DanielKO
非常感谢您的评论。所以我可能不会使用这个,除非API需要。 – sevenOfNine