猿问

指向类数据成员的指针“:*”

指向类数据成员的指针“:*”

我偶然发现了一个奇怪的代码片段,它编译得很好:

class Car{
    public:
    int speed;};int main(){
    int Car::*pSpeed = &Car::speed;
    return 0;}

为什么C+是否有指向类的非静态数据成员的指针?什么这个奇怪的指针在实际代码中使用吗?


慕虎7371278
浏览 679回答 3
3回答

哔哔one

这是我能想到的最简单的例子,它传达了这种特性相关的罕见情况:#include&nbsp;<iostream>class&nbsp;bowl&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;apples; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;oranges;};int&nbsp;count_fruit(bowl&nbsp;*&nbsp;begin,&nbsp;bowl&nbsp;*&nbsp;end,&nbsp;int&nbsp;bowl::*fruit){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(bowl&nbsp;*&nbsp;iterator&nbsp;=&nbsp;begin;&nbsp;iterator&nbsp;!=&nbsp;end;&nbsp;++&nbsp;iterator) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;iterator->*fruit; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count;}int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;bowl&nbsp;bowls[2]&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;1,&nbsp;2&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;3,&nbsp;5&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"I&nbsp;have&nbsp;"&nbsp;<<&nbsp;count_fruit(bowls,&nbsp;bowls&nbsp;+&nbsp;2,&nbsp;&&nbsp;bowl::apples)&nbsp;<<&nbsp;"&nbsp;apples\n"; &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"I&nbsp;have&nbsp;"&nbsp;<<&nbsp;count_fruit(bowls,&nbsp;bowls&nbsp;+&nbsp;2,&nbsp;&&nbsp;bowl::oranges)&nbsp;<<&nbsp;"&nbsp;oranges\n"; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}这里要注意的是传入用于计数_水果的指针。这就省去了编写单独的count_apples和count_橙子函数的麻烦。

拉莫斯之舞

另一个应用程序是侵入列表。元素类型可以告诉列表下一个/prev指针是什么。因此,列表不使用硬编码名称,但仍然可以使用现有指针://&nbsp;say&nbsp;this&nbsp;is&nbsp;some&nbsp;existing&nbsp;structure.&nbsp;And&nbsp;we&nbsp;want&nbsp;to&nbsp;use//&nbsp;a&nbsp;list.&nbsp;We&nbsp;can&nbsp;tell&nbsp;it&nbsp;that&nbsp;the&nbsp;next&nbsp;pointer//&nbsp;is&nbsp;apple::next.struct&nbsp;apple&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;data; &nbsp;&nbsp;&nbsp;&nbsp;apple&nbsp;*&nbsp;next;};//&nbsp;simple&nbsp;example&nbsp;of&nbsp;a&nbsp;minimal&nbsp;intrusive&nbsp;list.&nbsp;Could&nbsp;specify&nbsp;the//&nbsp;member&nbsp;pointer&nbsp;as&nbsp;template&nbsp;argument&nbsp;too,&nbsp;if&nbsp;we&nbsp;wanted: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;template<typename&nbsp;E,&nbsp;E&nbsp;*E::*next_ptr>template<typename&nbsp;E>struct&nbsp;List&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;List(E&nbsp;*E::*next_ptr):head(0),&nbsp;next_ptr(next_ptr)&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;add(E&nbsp;&e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;access&nbsp;its&nbsp;next&nbsp;pointer&nbsp;by&nbsp;the&nbsp;member&nbsp;pointer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.*next_ptr&nbsp;=&nbsp;head; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;&e; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;*&nbsp;head; &nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;*E::*next_ptr;};int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;List<apple>&nbsp;lst(&apple::next); &nbsp;&nbsp;&nbsp;&nbsp;apple&nbsp;a; &nbsp;&nbsp;&nbsp;&nbsp;lst.add(a);}
随时随地看视频慕课网APP
我要回答