通过类的成员函数指针 执行函数
时间: 2023-07-05 10:13:17 浏览: 95
可以通过以下步骤来通过类的成员函数指针执行函数:
1. 定义一个指向类成员函数的指针,需要声明函数的返回类型和参数列表,例如:
```
typedef void (MyClass::*FuncPtr)(int);
```
2. 创建类对象,例如:
```
MyClass obj;
```
3. 初始化指向成员函数的指针,例如:
```
FuncPtr ptr = &MyClass::memberFunction;
```
4. 通过类对象和函数指针调用成员函数,例如:
```
(obj.*ptr)(42);
```
这将调用 `MyClass` 类的 `memberFunction` 成员函数,并传递整数值 `42` 作为参数。
需要注意的是,由于成员函数指针需要知道类的类型,因此需要使用 typedef 或者模板来定义成员函数指针类型。同时,调用成员函数时需要使用类对象来调用,因为成员函数需要访问类的成员变量和其他成员函数。
相关问题
函数指针指向类成员函数
函数指针可以指向类的静态成员函数,但是不能直接指向类的非静态成员函数。这是因为非静态成员函数包含了一个隐含的 this 指针,用于指向调用该函数的对象。因此,要想通过函数指针调用非静态成员函数,需要借助于一些技巧。
一种常见的做法是使用成员函数指针。成员函数指针与普通的函数指针不同,它需要指定类类型和成员函数的参数列表。具体的用法如下:
```cpp
class MyClass {
public:
void myFunction(int arg) {
// 执行一些操作
}
};
int main() {
void (MyClass::*funcPtr)(int) = &MyClass::myFunction; // 定义并初始化成员函数指针
MyClass obj;
(obj.*funcPtr)(42); // 通过对象和成员函数指针调用成员函数
return 0;
}
```
在上面的例子中,`funcPtr` 是一个指向 MyClass 类的非静态成员函数的指针。通过使用 `obj.*funcPtr` 的语法,我们可以调用这个指针所指向的成员函数。
成员函数指针做模板参数
在C++中,可以使用成员函数指针作为模板参数来实现多态行为。这样做的目的是为了能够在运行时动态地决定调用哪个对象的成员函数。以下是一个简单的示例:
```cpp
template <typename T, typename R, typename... Args>
class Base {
public:
using MemberFnType = R (T::*)(Args...);
void bindMemberFn(MemberFnType fn, T* obj) {
memberFn_ = fn;
object_ = obj;
}
void callMemberFn(Args... args) {
(object_->*(memberFn_))(args...);
}
private:
MemberFnType memberFn_;
T* object_; // 存储对象指针
};
// 示例:
class MyClass {
public:
int add(int a, int b) { return a + b; }
};
int main() {
MyClass obj;
Base<MyClass, int, int> base;
// 绑定成员函数
base.bindMemberFn(&MyClass::add, &obj);
// 调用成员函数
base.callMemberFn(2, 3); // 动态调用obj.add(2, 3)
return 0;
}
```
在这个例子中,`Base` 类模板接受一个成员函数类型的别名 `MemberFnType` 和一个对象指针类型。`bindMemberFn` 方法用于设置要调用的成员函数和对象,`callMemberFn` 方法则通过成员函数指针动态地执行指定的成员函数。
阅读全文