什么是用于类成员的指针?

时间:2010-05-06 05:06:21

标签: c++ pointers oop

我已经阅读了关于类成员的指针,但我从未见过它们被用于任何实际应用程序。有人可以解释一下这些指针的用例吗?是否真的有必要有这样的指针?

例如

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”的值?使用指向类成员的指针有什么好处?

4 个答案:

答案 0 :(得分: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等工具。

答案 1 :(得分:2)

如果您使用过MFC,您会看到指向成员函数概念的指针被大量使用(内部)

DECLARE_MESSAGE_MAP,BEGIN_MESSAGE_MAP,END_MESSAGE_MAP 见Message Maps

答案 2 :(得分:0)

我想的问题是:“指向成员数据的指针是通过简单的数据指针添加的?”我能想到的唯一答案是明确的含义:我们指的是这个类中的数据。

现在我可以看到有效的一些额外的意图文档的价值。我看到的一个可能非常强大的例子是我们的“类”实际上是一个遗留的C结构。现在我们没有该结构的本地方法,所以有一些与该结构显式关联的指针可能会使我们的代码更清晰。

答案 3 :(得分:0)

与所有C ++特性一样,指向成员的指针只是你可以在纯C中完成的语法糖。

指针到成员变量非常简单。一个用例是,如果您想编写一个(模板)函数,可以按任何字段对结构数组进行排序。通过传入指向成员的指针,您可以检索结构的任何实例的某个指定字段,而无需对该字段进行硬编码。当然,可以使用接受结构指针并返回字段值的仿函数。

指针到成员的功能稍微复杂一些。乍一看,它们就像普通的函数指针一样,知道如何传递隐藏的“this”指针。但虚拟功能使一个简单的想法变得非常复杂。

虚拟基类使得所有指向成员的指针非常复杂。这不是你想用简单的C结构自己编码的东西。但复杂的情况很少见。