2010-09-03 160 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); 
    // ... 
} 
相關問題