【问题标题】:What are pointers to class members used for?指向类成员的指针有什么用?
【发布时间】:2010-05-06 05:06:20
【问题描述】:

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

例如。

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

【问题讨论】:

    标签: c++ pointers oop


    【解决方案1】:

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

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

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

    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 等效项已经为您很好地封装了这一点。在某种程度上,当前标准还包括&lt;functional&gt; 中的std::mem_fun 等工具。

    【讨论】:

    • 是的,但是它们封装了用法——我已经有一段时间很少需要声明指向成员的指针了。
    • 为了演示的清晰,我可能会使用map::operator[]insertmake_pair 组合是如此冗长:p 很好的答案,谢谢:)
    【解决方案2】:

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

    DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP 见Message Maps

    【讨论】:

      【解决方案3】:

      我想的问题是:“指向成员数据的指针比指向数据的简单指针添加了什么?”我能想到的唯一答案是明确的含义:我们指向 this 类中的数据。

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

      【讨论】:

      • 如果你同时指定类实例和变量,你有一个普通的指针(地址完全指定)。当您指定变量而不是类实例时,您将获得一个指向成员的指针,这几乎只是从实例开头到存储该变量的位置的偏移量。这些信息足以让您在类的任何实例中访问并访问该变量。
      【解决方案4】:

      Pointer-to-member 与所有 C++ 功能一样,只是您可以在纯 C 中完成的操作的语法糖。

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

      指向成员函数的指针稍微复杂一些。乍一看,它们就像知道如何传递隐藏的“this”指针的普通函数指针。但是虚函数让一个简单的想法变得相当复杂。

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

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 2012-08-20
        • 2010-10-02
        • 1970-01-01
        • 2014-11-14
        • 2017-07-27
        • 2013-06-06
        • 1970-01-01
        相关资源
        最近更新 更多