2010-09-03 163 views
0

在以下代码中考虑以下语句: - “int B :: * bpm;”指向成员的指针

class B 
{ 
    public : 
     int bi; 
}; 
class D : public B 
{ 

}; 
int main() 
{ 
    D obj; 

    int B::*bpm; 
    bpm = &B::bi; 

    obj.*bpm = 1; 
    return 0; 
} 

*何时在设计/代码中使用“指向成员”的指针来改进我的设计/编码实践。 **

+0

请解决您的格式是有用的。代码需要以四个空格作为前缀。 – Ivo 2010-09-03 08:40:06

+0

?您已经在使用“指向成员的指针” – kennytm 2010-09-03 08:42:28

+2

一个好问题可能是'何时使用'指向成员的指针! – Chubsdad 2010-09-03 08:45:41

回答

3

来自STL的示例可能有所帮助。

+0

是的,STL真的缺少内置的这个功能。例如,在第一对元素的序列上使用算法是麻烦的。 – 2010-09-03 09:42:56

1

在谈论设计/编码实践时,对我来说,使用“指向成员”来访问您的成员并不是一个好的设计,这些成员无论如何都是公开的,并且可以以更明显的方式进行访问。

0

我不会太担心指向成员的指针。在大约15年的C++中,大约十年前我曾经使用它们一次。

已经内置到语言中的功能(即虚拟功能)可以防止您必须手动摆弄成员指针。

+0

你从未使用过MFC。 – 2010-09-03 09:37:30

+2

@亚历山大:不,我没有。我很高兴。 ':)' – sbi 2010-09-03 10:17:21

+1

@sbi:你真幸运 – 2010-09-03 10:55:21

1

当多个成员需要类似的功能时,有时可以使用指向成员的指针来避免代码重复。另一种方法是使用枚举来标识成员并将它们作为数组存储。

struct Foo 
{ 
    float a; 
    float b; 
}; 

void Interpolate(const Foo &x, const Foo &y, float f, int Foo::*member) 
{ 
    return x.*member*(1-f)+y.*member*f; 
} 

int main() 
{ 
    Foo x,y; 
    float ia = Interpolate(x,y,0.5,&Foo::a); 
    float ib = Interpolate(x,y,0.5,&Foo::b); 
} 

这只是样,在插值短而简单,但一旦类似的功能非常复杂,这可能是真的有益。

+0

在系统中处理'Foo'(假设是私有)数据的系统中有其他实体(名称空间函数)是否是个好主意? – Chubsdad 2010-09-03 09:44:51

+1

这只是一个概念的例子。在实践中,Interpolate可能是一个成员函数,或者您将通过成员函数访问a和b,并提供指向成员函数的指针。 – Suma 2010-09-03 09:49:30

1

指向成员的指针与指向函数的指针相似。当你需要它们时(很少在实践中),你会知道它的。我以前也遇到过

可能的使用案例是对一些行为的专门的算法,用模板,用不重复自己的唯一目标:

struct foo 
{ 
    double f1(double); 
    ... 
    double fn(double); 
    template <double (foo::*)(double)> double some_algorithm(...); 
}; 

然后使用a.some_algorithm<a::&fi>(...)

1

我想你可以看到指针成员类型的权力,如果你看看Stroustrup的例子:

class Interface { 
    public: 
     virtual start() = 0; 
     virtual stop() = 0; 
     virtual pause() = 0; 
     virtual resume() = 0; 

     virtual ~Interface() { } 
} 

typedef void (Interface::*P_MEM)(); // pointer to member type 

map<string, Interface*> variable; 
map<string, P_MEM>  operation; 

void call_member(string var, string oper) 
{ 
    (variable[var]->*operation[oper])(); // var.oper() 
} 

这使得一个函数或变量的动态访问。

  • 您也可以在类的工厂中使用它来设置行为。

您还将如何设置某种算法的行为(请参阅Alexandre的示例)?

  • 您可以编写一个行为类,但是您必须为每个函数创建一个类,并为所有类创建另一个接口,以便您的算法调用该类。如果课堂中没有任何数据,这不是一种浪费吗?
1

指针会员可以用于侵入名单

template<typename N, N *N::*nextp> 
class LinkedList { 
public: 
    LinkedList() 
    :head(0) 
    { } 

    void add(N *item) { 
    item->*nextp = head; 
    head = item; 
    } 

    N *gethead() { return head; } 

private: 
    N *head; 
}; 

struct Node { 
    int data; 
    Node *next; 
}; 

int main() { 
    LinkedList<Node, &Node::next> n; 
    Node a1 = { 1 }; 
    Node a2 = { 2 }; 
    n.add(&a2); 
    n.add(&a1); 
    // ... 
} 
相关问题