2013-10-31 70 views
0

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

#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

从这个例子,我不唱诗班肯定我什么时候应该使用成员变量的指针。

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

+0

什么时候?我会说约0.001%的时间。除非你使用一个需要指向成员变量的API的库。现在设计API可以更方便地使用访问成员的lambda表达式,而不是专门用来获取指向成员变量的指针。 – DanielKO

+0

非常感谢您的评论。所以我可能不会使用这个,除非API需要。 – sevenOfNine

回答

1

我认为这对于函数而不是可变成员更有用,但是同样的原则适用于两者。假设我有一个具有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

非常感谢。示例代码对理解何时使用非常有帮助。我很感激。 – sevenOfNine