以下是一些使用“成员变量指针”的示例代码。
#include <iostream>
using namespace std;
struct CData {
int m_x;
int m_y;
};
int main() {
CData obj = {10, 20};
int CData::*pData = &CData::m_x;
cout << obj.*pData << endl;
return 0;
}
http://ideone.com/hJyWP9
从这个例子中,我不确定何时应该使用成员变量指针。
您能告诉我一些使用成员变量指针的好处或示例吗?
最佳答案
我认为这对函数而不是变量成员有用得多,但是相同的原理对这两者都适用。
假设我有一类具有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();
对于变量成员,可能会发生类似的事情,尽管坦率地说,我从未将其用于变量,可能是因为您还可以使用直指针(例如,示例中的“ int *” ...),尽管我猜这会是一个很好的选择使用类指针来增加安全性的想法。
现在,我回想起不久之前,使用了一个带有公共const引用指针的类,该指针指向私有的变量成员。实际上,它是在给用户一个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;
这可能对某些人有用...
关于c++ - 何时使用成员变量指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19697442/