2010-05-06 49 views
7

我已閱讀關於類成員的指針,但我從未見過它們在任何實際應用程序中使用。有人可以解釋這些指針的用例嗎?真的有必要有這樣的指針嗎?指向類成員的指針是什麼?

例如,

class abc 
{ 
public: 
    int a; 
    abc(int val) { a = val; } 
}; 

int main() 
{ 
    int abc::*data; 
    abc obj(5); 

    data = &abc::a; 

    cout << "Value of a is " << obj.*data << endl; 

    return 0; 
} 

在上述例如:爲什麼以這種方式訪問​​'a'的值?使用指向類成員的指針的優點是什麼?

回答

9

一個指針到成員或指針到成員函數的最大好處是,你

  • 沒有綁定到特定的實例馬上
  • 不需要要對成員名稱進行任何限制,只有類型必須匹配。

這可以用於例如,回調或抽象的算法:

std::map<int,int> m; 
m.insert(std::make_pair(1,2)); 
m.insert(std::make_pair(3,4)); 
m.insert(std::make_pair(5,6)); 
std::ptrdiff_t s = 
    std::count_if(m.begin(), m.end(), 
        boost::bind(&std::map<int,int>::value_type::first, _1) > 2); 
std::cout << s << std::endl; // 2 

注意Boost.Bind來自Boost.Function及其等價物TR1已經封裝了很好的爲您服務。在一定程度上,目前的標準還包括在<functional>中的工具,如std::mem_fun

+0

'std :: mem_fun()'等人。依靠指向成員的指針。 – wilhelmtell 2010-05-06 06:04:25

+0

是的,但它們封裝了用法 - 我很少需要現在就宣佈指向成員的指針。 – 2010-05-06 06:06:53

+0

爲了演示的清晰度,我可能會使用'map :: operator []':'insert'和'make_pair'組合非常冗長:p好的答案謝謝:) – 2010-05-06 06:26:07

2

如果您已經使用MFC,你會看到指向成員函數的概念被大量使用(內部)

DECLARE_MESSAGE_MAP,BEGIN_MESSAGE_MAP,END_MESSAGE_MAP 見Message Maps

0

我想的問題是:「這是什麼指針將成員數據添加到簡單的數據指針?「我能想到的唯一答案就是具有明確含義的水平:我們指向這個類的數據。

現在我可以看到什麼是有效的一些附加文檔的意圖的一些價值。我見過的一個例子可能非常強大,那就是我們的「類」實際上是一個傳統的C結構。現在我們沒有這個結構體的本地方法,所以有一些明確與該結構體相關聯的指針可能會使我們的代碼更清晰。

+1

如果你指定了類實例和變量,你就有一個普通的指針(地址是完全指定的)。這是當你指定變量而不是你得到一個指向成員的類實例,這幾乎就是從實例開始到存儲該變量的位置的偏移量。這是足夠的信息去關閉並訪問該類的任何實例中的變量。 – 2010-05-06 05:29:25

0

指針到部件,像所有的C++功能,只爲你的東西可能已經在純C.

做指針到成員變量是相當簡單的語法糖。一個用例是,如果你想寫一個(模板)函數,可以按任何字段對結構數組進行排序。通過傳遞一個指向成員的指針,您可以檢索結構的任何實例的某個指定字段,而無需對該字段進行硬編碼。當然,可以使用接受結構指針並返回字段值的函數來代替。

指針到成員函數有點複雜。乍一看,它們就像普通函數指針一樣,知道如何傳遞隱藏的「this」指針。但是虛函數使得一個簡單的想法變得非常複雜

虛擬基類使所有指向成員的指針非常複雜。這不是你想用簡單的C結構編碼的東西。但複雜的情況很少見。