2010-05-06 109 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结构编码的东西。但复杂的情况很少见。