指向不同类成员

时间:2015-07-23 10:21:48

标签: c++ class function-pointers

我有以下问题:

class A
{
public:
   A()
   {}
   int foo(int a)
   {
      return a;
   }
};

class B
{
private:
   int (A::*pFoo)(int);
public:
   B(int (A::*_pFoo)(int))
  {
     this->pFoo = _pFoo;
  }
     int cFoo(int i)
  {
     this->pFoo(i); //this causes a problem the compiler says it's not a pointer
  }
};

A a;
B b(&A::foo);

我已经尝试过了

int (*pFoo)(int)

而不是

int (A::*pFoo)(int)

但是构造函数存在问题 当我使用B b(&a.foo)时出现编译错误,说我必须使用B b(&A::foo)

3 个答案:

答案 0 :(得分:1)

您尝试为A:foo类型的对象调用B,但指向A成员函数的指针需要A的实例。

您可以重新设计A的代码,而不是在B内保存另一个指针或对B的引用,而不是更通用:

#include <functional>
struct A
{
  int foo(int a)
  {
    return a;
  }
};

class B
{
private:
  std::function<int(int)> pfoo;
public:
  B(std::function<int(int)> foofunc) 
    : pfoo(foofunc) { }
  int cFoo(int i)
  {
    return pfoo(i); 
  }
};

现在B可以使用一个int参数返回int的任何函数指针,并且只需将A::foo的函数指针绑定到A的实例}:

A my_a;
B my_b(std::bind(&A::foo, my_a, std::placeholders::_1));

my_b.cFoo(2); // works

execute

答案 1 :(得分:0)

你错过了B的构造函数中的右括号:

B(int (A::*_pFoo)(int))

通过成员函数指针调用的正确语法是:

(this->*pFoo)(i);

答案 2 :(得分:0)

在进入指针之前,你有很多语法错误。

工作示例: http://coliru.stacked-crooked.com/a/1f8fb012496548e0

1)你错过了c.tor上的括号

B(int (A::*_pFoo)(int))

2)你的课程结束不好,他们在结束时需要;

class A{};

3)你没有任何主力。

4)你激活pFoo错误。想一想。如果pFoo是指向A成员函数的指针,你真的可以从B指针激活吗?因为这是this指向B类的内容。你需要用A指针激活pFoo。

A* a = nullptr;
return (a->*pFoo)(i); 
  1. 不完全是语法错误,但最好是正确识别代码。