构造函数/OOP 中的函数指针
Function pointer in constructor / OOP
我有两个class:
typedef int(*sumpointer)(int a, int b);
class A
{
A(sumpointer a, int b, int c)
{
// DO SOMETHING
}
};
class B {
A *a;
B()
{
a = new A(sum, 5, 6);
}
int sum(int a, int b) {
return (a + b);
}
};
在线a = new A(sum, 5, 6);
我有一个语法错误:
No instance of constructor "A::A" matches the argument list argument
types are (int(int a, int b), int , int)
我该如何解决?
您不能使用原始函数指针指向非静态 class 方法。您需要改用指向成员的指针,例如:
class A;
class B {
A *a;
B();
int sum(int val1, int val2);
};
typedef int (B::*sumpointer)(int val1, int val2);
class A {
A(B *b, sumpointer s, int val1, int val2);
};
A::A(B *b, sumpointer s, int val1, int val2)
{
(b->*s)(val1, val2);
}
B::B() {
a = new A(this, &B::sum, 5, 6);
}
int B::sum(int val1, int val2) {
return (val1 + val2);
}
在 C++11 及更高版本中,使用 std::function
代替:
#include <functional>
using sumpointer = std::function<int(int, int)>;
class A {
A(sumpointer s, int val1, int val2);
};
class B {
A *a;
B();
int sum(int val1, int val2);
};
A::A(sumpointer s, int val1, int val2)
{
s(val1, val2);
}
B::B() {
a = new A([this](int val1, int val2) { return this->sum(val1, val2); }, 5, 6);
/* or:
using std::placeholders::_1;
using std::placeholders::_2;
a = new A(std::bind(&B::sum, this, _1, _2), 5, 6);
*/
}
int B::sum(int val1, int val2) {
return (val1 + val2);
}
最简单的解决方法是将 sum
移出 B
:
int sum(int a, int b) {
return (a + b);
}
class B {
A *a;
B()
{
a = new A(sum, 5, 6);
}
};
我有两个class:
typedef int(*sumpointer)(int a, int b);
class A
{
A(sumpointer a, int b, int c)
{
// DO SOMETHING
}
};
class B {
A *a;
B()
{
a = new A(sum, 5, 6);
}
int sum(int a, int b) {
return (a + b);
}
};
在线a = new A(sum, 5, 6);
我有一个语法错误:
No instance of constructor "A::A" matches the argument list argument
types are (int(int a, int b), int , int)
我该如何解决?
您不能使用原始函数指针指向非静态 class 方法。您需要改用指向成员的指针,例如:
class A;
class B {
A *a;
B();
int sum(int val1, int val2);
};
typedef int (B::*sumpointer)(int val1, int val2);
class A {
A(B *b, sumpointer s, int val1, int val2);
};
A::A(B *b, sumpointer s, int val1, int val2)
{
(b->*s)(val1, val2);
}
B::B() {
a = new A(this, &B::sum, 5, 6);
}
int B::sum(int val1, int val2) {
return (val1 + val2);
}
在 C++11 及更高版本中,使用 std::function
代替:
#include <functional>
using sumpointer = std::function<int(int, int)>;
class A {
A(sumpointer s, int val1, int val2);
};
class B {
A *a;
B();
int sum(int val1, int val2);
};
A::A(sumpointer s, int val1, int val2)
{
s(val1, val2);
}
B::B() {
a = new A([this](int val1, int val2) { return this->sum(val1, val2); }, 5, 6);
/* or:
using std::placeholders::_1;
using std::placeholders::_2;
a = new A(std::bind(&B::sum, this, _1, _2), 5, 6);
*/
}
int B::sum(int val1, int val2) {
return (val1 + val2);
}
最简单的解决方法是将 sum
移出 B
:
int sum(int a, int b) {
return (a + b);
}
class B {
A *a;
B()
{
a = new A(sum, 5, 6);
}
};