代码之家  ›  专栏  ›  技术社区  ›  srikanta

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

  •  7
  • srikanta  · 技术社区  · 15 年前

    我读过关于指向类成员的指针的文章,但我从未见过它们被用于任何实际应用中。有人能解释这些指针的用例是什么吗?有必要有这样的指针吗?

    如。

    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 回复  |  直到 15 年前
        1
  •  9
  •   Georg Fritzsche    15 年前

    指向成员的指针或指向成员函数的指针的最大优点是

    • 不必立即绑定到特定实例
    • 不需要对成员名设置任何限制,只需要匹配类型。

    这可用于回调或抽象算法:

    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等价物已经很好地为您封装了它。在某种程度上,现行标准还包括以下工具: std::mem_fun 在里面 <functional> .

        2
  •  2
  •   SysAdmin    15 年前

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

    声明消息映射,开始消息映射,结束消息映射 见 Message Maps

        3
  •  0
  •   djna    15 年前

    我想的问题是:“指向成员数据的指针加上指向数据的简单指针是什么?”我能想到的唯一答案是一个明确意义的层次:我们指的是 班级。

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

        4
  •  0
  •   Ben Voigt    15 年前

    指向成员的指针和所有C++特性一样,只是在纯C中已经完成的语法糖。

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

    指向成员函数的指针有点复杂。乍一看,它们就像普通的函数指针,知道如何传递隐藏的“this”指针。但是虚拟函数使一个简单的概念变得相当复杂。

    而虚拟基类使指向成员的所有指针变得非常复杂。这不是你想用简单的C结构自己编写代码的事情。但这些复杂的病例是罕见的。