我已经阅读了关于类成员的指针,但我从未见过它们被用于任何实际应用程序。有人可以解释一下这些指针的用例吗?是否真的有必要有这样的指针?
例如
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”的值?使用指向类成员的指针有什么好处?
答案 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结构自己编码的东西。但复杂的情况很少见。