c++: 指向类成员函数的指针

指向函数的指针有和指向类成员函数的指针的有什么不同?

int f(char a, float b);
如果它是普通函数,则它的类型是 int (*)(char, float);
如果它是非静态成员函数,则它的类型是 int(ClassName::*)(char, float);
如果它是静态成员函数,则它的类型是和普通函数一样。

如何把一个类的成员函数传递给event handler, 线程启动函数等?

类的成员函数必须和一个类的实例结合起来才有意义。可以写一个函数来包装类的成员函数。

class X {
    public:
    void f();
    static void sf();
};

X x*;

void wapper_f() { x->f(); }

int main() {
    signal(SIGINT, wapper_f); // ok
    signal(SIGINT, X::sf); // ok
}

如何更方便地去创建一个执行类成员变量的类型?

用typedef.

class Fred {
    public:
        int f(char x);
        int g(char x);
};

typedef int (Fred::*FredFn)(char x);

void f() {
    FredFn fn = &Fred::f;
}

void f2(FredFn fn) {... }
FredFn f3() {...}

如何更方便的调用通过指针指向的类成员函数?

#define CALL_MEMBER_FN(object, prtToMember) ((object).*(prtToMember))

void userCode(Fred &fred, FredFn fn) {
    int ans = CALL_MEMBER_FN(fred, fn)(3);
}

原文参考:

https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types

时间: 2024-10-29 19:07:13

c++: 指向类成员函数的指针的相关文章

指向类成员函数的指针

//类中的普通成员变量,类名::变量名,在栈上 //类名 *指针名=new 类名,在堆上 //类的静态成员变量,在静态区 //函数都在代码区,类的函数.静态函数都是共享的 void(myclass::*p1)() = myclass::run;//指向类成员函数的指针 void(*p2)() = myclass::go;//指向静态成员函数的指针 1 #include <iostream> 2 3 class myclass 4 { 5 public: 6 int num; 7 int dat

类的成员函数的指针

前面一篇文章<函数的指针 >介绍了全局函数的指针,现在我们再来介绍一下成员函数的指针. 成员函数指针的定义: 一般形式 Return_Type (Class_Name::* pointer_name) (Argument_List); 用typedef简化的形式 Typedef Return_Type (Class_Name::* FuncPtr_Type) (Argument_List); FuncPtr_Type pFunc = NULL; //pFunc为成员函数指针的指针变量 成员函数

类成员函数的指针与多态性

1 类成员函数的指针 2 类成员函数的指针数组 3 指向类成员函数的指针的指针 1 类成员函数的指针 auto func1 = &com::jia;//C++函数指针 int (com::*p)(int, int) = &com::jia;//C函数指针 1 #include <iostream> 2 3 class com 4 { 5 private: 6 int a; 7 int b; 8 public: 9 com(int x, int y) :a(x), b(y) 10

如何使用指向类的成员函数的指针(详解!)

我们首先复习一下"指向函数的指针"如何使用? [cpp] view plain copy print? void print() { } void (*pfun)(); //声明一个指向函数的指针,函数的参数是 void,函数的返回值是 void pfun = print;   //赋值一个指向函数的指针 (*pfun)();    //使用一个指向函数的指针 比较简单,不是吗?为什么*pfun需要用()扩起来呢? 因为*的运算符优先级比()低,如果不用()就成了*(pfun()).

c++ 指向类成员函数的函数指针

// ConsoleApplication34.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class Parent { public: Parent() { //cout << "我是爹" << endl; } virtual void print() { cout << "我是爹&

C++类的成员函数的指针和mem_fun适配器的用法

一.普通函数指针 我们先来看一个最简单的函数: void fool(int a) { cout << a<< endl; } 那么它的函数指针类型为: void (*) (int) 我们可以这样测试: void (*pFunc)(int) = &foo;//这里pFunc是个指针 pFunc(123); 这样就会打印出整数123:为了简化,我们可以使用typedef: typedef void (*pFunc)(int); 这里我们要说明一下: 这里的pFunc是 返回值为

C++ 面向对象 类成员函数this指针

每个类成员函数都只涉及一个对象, 即调用它的对象. 但有时候方法可能涉及到两个对象, 在这种情况下需要使用C++ 的 this 指针 假设将方法命名为topval(), 则函数调用stock1.topval()将访问stock1的对象数据:stock2.topval()将访问stock2的对象数据: 如果希望该方法的两个对象进行对比, 则必须将第二个对象作为参数传递给它.这时候涉及到隐式和显式: top = stock1.topval(stock2); 隐式的访问了stock1, 显示的访问了s

C++成员函数指针的应用

 C++中,成员指针是最为复杂的语法结构.但在事件驱动和多线程应用中被广泛用于调用回叫函数.在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数.在这样的应用中,如果不用成员指针,编程是非常困难的.  刚遇到这种语法时也许会让你止步不前.但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的.本文引导你了解成员函数指针的声明,赋值和调用回叫函数.  成员函数指针的声明  一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数.初看上去,语法有点复杂.其实可以把

指向类成员的指针

c++语言中,可以说明指向类的数据成员的指针和指向类的成员函数的指针. 这两种指针必须与对象或指向对象的指针结合使用. 1.指向类的数据成员的指针定义格式为: 类型名 类名:: *指针; 这种说明不是说指针属于类的,而是说明指针只能指向指定类的指定类型的成员. 2.指向类的成员函数的指针 类型名 (类名:: *指针)(参数表); 同样的道理,函数指针并不属于类,而是只能指向类的指定原型的函数. #include<iostream.h> class A {public: int a; int b