首页
学习
活动
专区
工具
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。...f(Sc &s) 10 { 11 s.nsfn(10); // 转换为Sc::nsfn(&s , 10) 12 s.sfn(10); // 转换为Sc::sfn(10) 13 } 函数...对nsfn()调用,编译像注解那样进行转换,s地址作为第一个传递参数。(你并不实际写该调用,由编译来实现。)...在函数内部,Sc::nsfn()对静态成员访问将自动把this参数作为指向当前对象指针。而当Sc::sfn()被调用时,没有任何对象地址被传递。因此,当访问静态成员时,无this指针出错。...这就是为什么一个静态成员函数与任何当前对象都无联系原因。

1.8K90

静态成员函数访问静态数据成员【C++】

初始化: 类型 名 :: 静态数据成员 = 初始化值 ; 详解:静态数据成员必须在外初始化,不可在体内,因为:构造函数中,如果可以,则每次建立对象,都会对静态数据成员值进行修改,这违背静态数据成员使用目的...,为了能处理静态数据成员静态成员函数不能默认引用本类静态数据成员原因: 当调用一个对象静态成员函数时,系统会将该对象起始地址赋予成员函数this指针。...然而,静态成员函数不属于对象,无this指针。所以静态成员函数不能访问默认静态成员静态成员函数静态数据成员)。...//静态成员函数外定义 参数表中创建对象 cout << "x=" << m.x << endl; //<em>静态</em><em>成员</em><em>函数</em>通过对象访问<em>非</em><em>静态</em>数据<em>成员</em> cout << "y=" <...<em>非</em><em>静态</em><em>成员</em> ; <em>类</em>名 :: <em>非</em><em>静态</em><em>成员</em> ; 故:实例化对象即可完成对<em>非</em><em>静态</em>数据<em>成员</em><em>的</em>访问

1.2K20

C++静态数据成员静态成员函数

定义时候静态数据成员是不分配内存,只有在创建对象时候才分配内存,但静态数据成员是要分配内存,因为它是属于,只有一块内存,所以要初始化它,而且不能在声明中初始化,必须要在外初始化...静态成员函数 一般都是在静态成员函数中修改静态数据成员,在刚刚手机声明中成员函数: static void change(); 就是静态成员函数。...我们给它来一个外定义: void redmik30pro::change() { battery-=10; } 要注意是,静态成员函数只能访问静态数据成员静态成员函数,不能访问静态数据成员,如果要访问静态数据成员...首先,可能你在做题时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在创建时候就存在了,在没有创建对象时候就已经存在静态成员函数,而普通函数必须在对象被创建时候才能被使用...简而言之,静态成员函数是服务于,而不是某个对象,它方便在于不需要定义对象就能使用。

16830

C++成员函数 | 成员函数

C++成员函数性质 在C++中,成员函数函数一种,它有返回值和函数类型,它与一般函数区别只是:  属于一个成员,出现在体中。...C++在使用函数时,要注意调用它权限以及它作用域,私有的成员函数只能被本类中其他成员函数所调用,而不能被外调用,成员函数可以访问本类中任何成员,可以引用在本作用域中有效数据。 ...一般做法是需要被外界调用成员函数指定为 public,它们是对外接口,但应注意,并非要求把所有成员函数都指定为 public。...这种函数作用是支持其他函数操作,是中其他成员函数外用户不能调用这些私有的函数。  成员函数体中十分重要部分。...C++外定义成员函数 上述所讲成员函数是在体中定义,在C++中也可以在体中只写成员函数声明,而在外面进行函数定义。

1.8K74

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

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

95320

《挑战30天C++入门极限》C++静态数据成员静态成员函数

C++静态数据成员静态成员函数   在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象程序是由对象构成,我们如何才能在范围内共享数据呢...这个问题便是本章重点:   声明为static成员或者成员函数便能在范围内共同享,我们把这样成员称做静态成员静态成员函数。   ...便运行加1操作,静态成员初始化应该在主函数调用之前,并且不能在声明中出现,通过运行过程观察我们发现,静态成员count状态并不会随着一个新对象新建而重新定义,尽而我们了解到静态成员函数由于与对象无关系...根据静态成员特性我们可以简单归纳出几点,静态成员使用范围:   1.用来保存对象个数。   ...(静态成员完全可以替代全局变量),这个例子理解重点主要是要注意观察成员析构顺序,通过对析构顺序理解,使用析构函数来进行节点脱链操作。

68630

C++this指针,静态成员,友元函数友元

静态成员 在变量或者函数前面加上关键字:static,它就变了一个静态变量或者静态函数,当static出现在中被修饰成员中,被成为静态成员。...,在静态函数里面,不可以直接访问静态成员。...友元函数友元 所谓友元函数,就是在中,用friend关键字声明一个函数,这个函数声明在中,但不作为成员函数,虽然友元函数不属于成员函数,却可以访问成员,不论成员是public,pirvate...:在实现之间数据共享时,减少系统开销,提高效率,具体来说:为了使其他成员函数直接访问该类私有变量,同时也破坏了封装性,所以不到万不得已,还是不要用友元函数。...因为是需要友元来共享数据,那么大多数情况,友元函数都是有参数, 因为友元函数没有this指针,则参数要有三种情况: 要访问static成员时,需要对象做参数; 要访问static成员或全局变量时

1.5K10

原创】C++成员函数重载、覆盖和隐藏

题目: 成员函数重载、覆盖和隐藏区别描述正确有?...、函数名字相同,参数相同,基无virtual关键字派生函数会"隐藏"父函数 答案: CD 解析: a.成员函数被重载特征: (1)相同范围(在同一个中); (2)函数名字相同;...b.覆盖是指派生函数覆盖基函数,特征是: (1)不同范围(分别位于派生与基); (2)函数名字相同; (3)参数相同; (4)基函数必须有virtual 关键字。 c....“隐藏”是指派生函数屏蔽了与其同名函数,规则如下: (1)如果派生函数与基函数同名,但是参数不同。此时,不论有无virtual关键字,基函数将被隐藏(注意别与重载混淆)。...(2)如果派生函数与基函数同名,并且参数也相同,但是基函数没有virtual关键字。此时,基函数被隐藏(注意别与覆盖混淆)。

67720

#抬抬小手学Python# 函数成员函数静态函数、抽象函数、方法伪装属性

十五、函数成员函数静态函数、抽象函数、方法伪装属性 本篇博客是滚雪球学 Python 第二轮最后一篇博客,我们内容继续提升到面向对象部分,为你补充里面的一些装饰器,学习之后,希望你 Python...构造函数") self.x = "构造函数属于实例变量" # 方法,第一个参数必须默认,一般习惯用 cls。...形式调用,不过这两种调用都只是传递到了函数内部,不存在差异。 函数不能调用实例变量,只能调用变量,所谓变量就是在中独立声明,不在任何函数中出现变量。...15.3 函数静态函数在继承表现 --------------------- 先创建一个父,其中包含两个静态函数与一个函数。...() 测试之后,基本结论如下: 如果在子类中覆盖了父静态函数,那调用时使用是子类自己静态函数, 如果在子类中没有覆盖父静态函数,那调用时使用是父静态函数函数同样遵循该规则

1K30

C++:30 ---C++成员成员函数内存布局

前面两篇文章我相信大家反复读了之后对这节不陌生了: 首先来看代码: class Demo { public: //静态成员变量 static const int sx = 0; //静态函数..." << std::hex << std::showbase << ut.addr << endl; cout << "静态成员函数SF1()地址是:" << std::hex << std::...这里要指出是大家可以看到静态成员函数静态成员变量sx地址都是0x00007FF开头,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内局部变量i地址:...showbase << &pObj.x << endl; cout << "静态成员函数SF1()地址是:" << std::hex << std::showbase << Demo::SF1 <...我想你现在根据刚才打印成员变量,成员函数,虚函数表地址已经可以自己画出成员内存布局了。

1.2K20

_成员函数可以访问本类对象私有成员

成员函数可以访问本类对象私有成员 sList是一个 私有成员是head,有一个成员函数形参是本类对象(引用,引不引用不影响结论和原因) ==为什么呢!...对象b是sList,而这个intersection函数是sList成员函数 head虽然是sList对象私有成员,但是是在sList内访问 ==就是 在内访问了本类(实例化对象)私有成员...因为这是在内访问,又不是在外== 这说明了,成员访问权限,是对于====而言,决定在====外是否可被访问 而非对于对象来说(因为对象不同但是都是属于同一种实例化对象成员,...本来就是成员,只是抽象和实例化问题 这非常合理地体现了 封装性 这个就是不行,在外访问了 这一点是非常好用,可以利用这一点 ==用成员函数肆无忌惮地访问对象私有成员!...==只要声明函数成员函数外部同类对象设为形参(或加个引用)就可以了!! 不必再为如何访问到同类外部对象私有成员而苦思了!

83930

c++之类成员变量和成员函数是分开存储

C++程序内存格局通常分为四个区: 全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即自由存储区)。...全局数据区存放全局变量,静态数据和常量; 所有成员函数和非成员函数代码存放在代码区; 为运行函数而分配局部变量、函数参数、返回数据、返回地址等存放在栈区;余下空间都被称为堆区。...根据这个解释,我们可以得知在定义时,成员函数是被放在代码区,而静态成员变量在定义时就已经在全局数据区分配了内存,因而它是属于。...对于静态成员变量,我们是在实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象

1.9K40

Java继承中static成员函数重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常static函数那样运行。...也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。...static in testClass1 16 tc2.SMothod(); //输出结果为 static in testClass2 17 } 18 } 从结果中可以看到,当我们用父实例引用...(实际上该实例是一个子类)调用static函数时,调用是父static函数。...原因在于方法被加载顺序。 当一个方法被调用时,JVM首先检查其是不是方法。如果是,则直接从调用该方法引用变量所属中找到该方法并执行,而不再确定它是否被重写(覆盖)。

1.7K40

C++自动提供特殊成员函数

复制构造函数功能: 默认复制构造函数逐个复制⾮静态成员成员复制也称为浅复制),复制成员值。 静态函数(如num_strings)不受影响,因为它们属于整个,⽽不是各个对象。...... } ``` - 如果类中包含用于记录对象数**静态成员**,且其值会在新对象被创建时发生变化,则应提供一个显式复制构造函数来处理计数问题。...,⼀些成员是**使⽤new初始化**、指向数据指针,⽽不是数据本⾝。...当 然,编译器开发⼈员通常不会花时间添加这样⾏为。 如果成员本⾝就是对象,则程序将使⽤为这个定义赋值运算符来复制该成员,但静态数据成员不受影响。...赋值操作并不创建新对象,因此不需要调整静态数据成员 num_strings值。 地址运算符:

70210

【C++】C++ this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析 在 C++ 中 , 普通静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 中 , 定义了 void fun(int...使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 中 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...与 静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数中 不能修改 对象中 任何成员变量 ; class Student { public: void fun..." << endl; } ~Student() { cout << "执行 Student 析构函数" << endl; } // 使用 const 修饰 成员函数 // const

19120

STL1——string 所有成员函数

string 所有成员函数 写代码时经常会遇到对字符串处理,如下是string成员函数 函数名称 功能 构造函数 产生或复制字符串 析构函数 ~string() 销毁字符串 =,assign...使用 STL 必然会涉及容器,而容器中存储了大量数值,必然需要分配内存空间。配置器作用就是为容器分配内存。 配置器最早是为内存模型抽象化而提出。...所以使用内存配置器分配内存时,是按对象个数进行,而不是按字节数。这有别于原来 new [] 和 new 操作符。配置器最大优点在于,配置器实现了算法、容器与物理存储细节分隔。...basic_string 模板中包含 1 个配置器类型成员 allocator_type。...内存,便于 string 对象存储 char 型字符。

67620

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券