何时使用成员变量指针

时间:2013-10-31 02:30:44

标签: c++

以下是使用“成员变量指针”的一些示例代码。

#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

从这个例子中,我不确定何时应该使用成员变量指针。

您能告诉我使用成员变量指针的一些好处或示例吗?

1 个答案:

答案 0 :(得分:1)

我认为这对函数而不是变量成员更有用,但同样的原则适用于两者。

假设我有一个包含3个函数的类,这些函数依赖于某些事情,例如你正在运行的处理器(即INTEL与AMD,或支持SSE4的处理器与仅使用SSE2的旧处理......)< / p>

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_

这使得'value'非常安全,与裸指针相反。

另请注意,您可以编写以下内容:

P p, q;
p.*q.ref = q.*p.ref;

这可能对某些人有用......