指向成员的指针

时间:2010-09-03 08:36:42

标签: c++ pointers pointer-to-member

在下面的代码中考虑以下语句: - “int B :: * bpm;”

class B
{
    public :
        int bi;
};
class D : public B
{

};
int main()
{
    D obj;

    int B::*bpm;
    bpm = &B::bi;

    obj.*bpm = 1;
    return 0;
}

*何时在设计/代码中使用“指向成员的指针”以改进我的设计/编码实践。 **

7 个答案:

答案 0 :(得分:3)

来自STL的示例可能有所帮助。

答案 1 :(得分:1)

谈到设计/编码实践,对我而言,使用“指向成员的指针”来访问您的成员并不是一个好的设计,无论如何这些成员都是公开的,并且可以以更明显的方式访问。

答案 2 :(得分:1)

当多个成员需要类似的功能时,有时可以使用指向成员的指针来避免代码重复。另一种方法是使用枚举来标识成员并将它们存储为数组。

struct Foo
{
  float a;
  float b;
};

void Interpolate(const Foo &x, const Foo &y, float f, int Foo::*member)
{
  return x.*member*(1-f)+y.*member*f;
}

int main()
{
  Foo x,y;
  float ia = Interpolate(x,y,0.5,&Foo::a);
  float ib = Interpolate(x,y,0.5,&Foo::b);
}

这只是示例,插值简短,但一旦类似的功能很复杂,这可能是非常有益的。

答案 3 :(得分:1)

指向成员的指针与指向函数的指针具有相似的用途。当你需要它们时(很少在实践中),你就会知道它。

我之前遇到的一个可能的用例是使用模板专门针对某些行为的算法,唯一的目标是不重复自己:

struct foo
{
    double f1(double);
    ...
    double fn(double);
    template <double (foo::*)(double)> double some_algorithm(...);
};

然后你使用a.some_algorithm<a::&fi>(...)

答案 4 :(得分:1)

如果您查看Stroustrup的示例,我认为您可以看到指向成员类型的指针的力量:

class Interface {
    public:
         virtual start() = 0;
         virtual stop() = 0;
         virtual pause() = 0;
         virtual resume() = 0;

         virtual ~Interface() { }
}

typedef void (Interface::*P_MEM) (); // pointer to member type

map<string, Interface*> variable;
map<string, P_MEM>      operation;

void call_member( string var, string oper )
{
    (variable[var]->*operation[oper])();  // var.oper()
}

这允许动态访问函数或变量。

  • 您也可以在类的工厂中使用它来设置行为。

您如何设置某种算法的行为(参见Alexandre的例子)?

  • 您可以编写一个行为类,但是您必须为每个函数创建一个类,并为所有类创建另一个接口,以便您的算法调用它。如果你的课程中没有任何数据,这不是浪费吗?

答案 5 :(得分:1)

指向成员的指针对于侵入列表非常有用

template<typename N, N *N::*nextp>
class LinkedList {
public:
  LinkedList()
    :head(0)
  { }

  void add(N *item) {
    item->*nextp = head;
    head = item;
  }

  N *gethead() { return head; }

private:
  N *head;
};

struct Node {
  int data;
  Node *next;
};

int main() {
  LinkedList<Node, &Node::next> n;
  Node a1 = { 1 };
  Node a2 = { 2 };
  n.add(&a2);
  n.add(&a1);
  // ...
}

答案 6 :(得分:0)

我不会过分担心会员的指针。在大约十年前的大约15年的C ++中,我使用过它们一次。

已经内置到语言中的功能(即虚函数)可以防止您手动操作成员指针。