首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将非静态成员函数传递给另一个类的成员函数

是一种常见的编程技巧,可以通过函数指针、函数对象或Lambda表达式来实现。

  1. 函数指针:函数指针是指向函数的指针变量,可以将一个非静态成员函数的地址赋值给函数指针,然后通过函数指针调用该成员函数。在C++中,可以使用类名加上作用域解析运算符(::)来获取非静态成员函数的地址。例如,假设有两个类A和B,其中B的成员函数需要调用A的非静态成员函数,可以定义一个函数指针类型,将A的成员函数地址赋值给该函数指针,然后在B的成员函数中通过函数指针调用A的成员函数。

示例代码:

代码语言:txt
复制
class A {
public:
    void func() {
        // 非静态成员函数
    }
};

class B {
public:
    using FuncPtr = void (A::*)(); // 定义函数指针类型

    void setCallback(FuncPtr callback) {
        callback_ = callback;
    }

    void invokeCallback() {
        A a;
        (a.*callback_)(); // 通过函数指针调用A的成员函数
    }

private:
    FuncPtr callback_;
};

int main() {
    A a;
    B b;
    b.setCallback(&A::func); // 将A的成员函数地址赋值给函数指针
    b.invokeCallback(); // 调用B的成员函数,间接调用A的成员函数
    return 0;
}
  1. 函数对象:函数对象是一个类对象,重载了函数调用运算符operator(),可以将一个非静态成员函数封装为函数对象,然后将该函数对象作为参数传递给另一个类的成员函数。在另一个类的成员函数中,可以直接调用函数对象的operator()来执行非静态成员函数。

示例代码:

代码语言:txt
复制
class A {
public:
    void operator()() {
        // 非静态成员函数
    }
};

class B {
public:
    void setCallback(A callback) {
        callback_ = callback;
    }

    void invokeCallback() {
        callback_(); // 直接调用函数对象的operator(),间接调用A的成员函数
    }

private:
    A callback_;
};

int main() {
    A a;
    B b;
    b.setCallback(a); // 将A的函数对象作为参数传递给B的成员函数
    b.invokeCallback(); // 调用B的成员函数,间接调用A的成员函数
    return 0;
}
  1. Lambda表达式:Lambda表达式是一种匿名函数,可以捕获外部变量,并以函数对象的形式使用。可以将一个非静态成员函数封装为Lambda表达式,然后将该Lambda表达式作为参数传递给另一个类的成员函数。在另一个类的成员函数中,可以直接调用Lambda表达式来执行非静态成员函数。

示例代码:

代码语言:txt
复制
class A {
public:
    void func() {
        // 非静态成员函数
    }
};

class B {
public:
    void setCallback(std::function<void()> callback) {
        callback_ = callback;
    }

    void invokeCallback() {
        callback_(); // 直接调用Lambda表达式,间接调用A的成员函数
    }

private:
    std::function<void()> callback_;
};

int main() {
    A a;
    B b;
    b.setCallback([&a]() { a.func(); }); // 将A的成员函数封装为Lambda表达式,并作为参数传递给B的成员函数
    b.invokeCallback(); // 调用B的成员函数,间接调用A的成员函数
    return 0;
}

这种将非静态成员函数传递给另一个类的成员函数的技巧在很多场景中都有应用,例如回调函数、事件处理等。在腾讯云的云计算平台中,可以使用函数指针、函数对象或Lambda表达式来实现这种功能,具体的产品和链接地址可以根据实际需求选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 类和对象的提高

    #this指针 其作用就是指向成员函数所作用的对象 非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针 例如:想要将某对象的公有成员自增,写一个函数 complex addone(){ this->real++;// 等价于real++; this->print();//等价于print return *this; } 在主函数中: int main(){ complex c1(1,1),c2(0,0); c2=c1.addone(); //这样不需要再传递参数了 return 0; } *静态成员函数不能使用this指针,因为静态成员函数并不具体作用某个对象 *因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数 #静态成员函数 静态成员,在声明前面加上static关键字 普通对象每个成员都有各自的一份,静态成员变量被所有对象所共享 普通成员函数必须具体作用于某个对象,静态成员函数并不具体作用于某个对象 **因此静态成员不需要通过对象就可以访问** 访问静态成员 1.类名::成员名 2.对象名.成员名 3.指针->成员名 4.引用.成员名 静态成员变量本质上全局变量,静态成员函数本质上是全局函数 例如,考虑一个随时知道矩形总数和总面积的图形处理程序 可以用全局变量或者静态成员变量来表示,但考虑不同 结构体中定义中,将w,h定义长宽,当出现一个对象时候(**在构造函数里完成**),总数变量加1,面积变量也是增加 同理在**析构函数**里面将其对应的减少,值得注意的是不能忘记了复制构造函数 *在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数 #成员对象和封闭类 有成员对象的类叫做封闭类(在一个类里面有其他类(被称为成员对象),这个类叫封闭类) 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的 具体做法是:*通过封闭类的构造函数的初始化列表 *封闭类构造函数和析构函数的执行顺序 1.先执行所有对象成员的构造函数,然后执行封闭类的构造函数 2.对象成员的构造函数调用次序和对象成员在类中的说明次序一次 3.当封闭类的对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数 #常量对象 常引用 如果不希望某个对象的值被改变,则定义该对象前可以加上const 可以在类的成员函数后面加上const关键字,则为常量成员函数 *常量成员函数执行期间不应修改其所作用的对象(成员对象,成员函数) 例如:void getvalue() const; //声明 注意*常量对象不能执行非常量成员函数,可以执行常量成员函数 #友元 友元分为友元函数和友元类两种 友元函数:一个类的友元函数可以访问该类的私有成员 声明:在前面加上frind 目的:为了保证某个类的函数能够访问其他类的私有成员 友元类:如果a时b的友元类,那么a的成员函数可以访问b的私有成员 *友元类之间的关系不能传递,不能继承

    03

    2021-04-14 quickjs调用类的非静态成员函数

    有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码的函数,而这个函数使用的数据又来自于当前的交易 首先不考虑用全局变量来保存交易的数据,因为js回调c函数的时候我们无法在回调函数中区分当前属于哪个交易,如果你总是把交易的id通过回调函数传递过来也是可以实现,只是这样函数就多了个参数,写js代码的人无法理解。 一个简单的思路是c代码创建交易的类,然后把类的函数传递给quickjs,然后在js中调用这个类的函数,但是这个实现不了,因为quickjs没有注入非静态成员函数的接口,其原因文章非static成员函数通过类名::来调用,空指针调用成员方法不出错!讲解的比较清楚 换个思路,我们先用js创建这个类,然后调用eval把类的数据传递给它,这样调用这个类的非静态成员函数的时候就可以正确访问到数据了,我们直接修改文件example.cpp 具体实现如下:

    02
    领券