不使用instance.function()语法 如何将实例作为this指针传入成员函数?
C++类成员函数显式传实例调用实现方案
可以实现你要的调用形式,原生非静态成员函数默认不支持直接这么写,有两种常用实现方案:
方案1:修改类定义,将成员函数改为静态,显式接收实例参数
这是最贴合你给出的A::foo(instance)调用形式的方案,代码示例如下:
// 修改后的头文件类定义 class A { public: // 改为静态成员函数,显式声明A类型引用参数接收实例 static void foo(A& instance) { std::cout << "Hello" << std::endl; // 若需要访问实例的成员,直接通过instance.xxx调用即可 } };
// main文件调用示例 // 注意:你原代码的A instance = new A;存在语法错误,new返回指针,正确写法如下 int main() { // 栈分配实例写法 A instance; A::foo(instance); // 完全符合你要求的调用形式 // 堆分配实例写法 // A* instance = new A; // A::foo(*instance); // delete instance; return 0; }
方案2:不修改原类定义,使用C++17标准库的std::invoke实现
如果你无法修改原有类的定义,可以用标准库提供的调用工具实现,代码示例如下:
#include <functional> // 需引入std::invoke的头文件 // 原类定义不需要任何修改 class A { public: void foo() {std::cout << "Hello" << std::endl;} }; int main() { A instance; // 直接传递成员函数指针和实例即可完成调用 std::invoke(&A::foo, instance); return 0; }
补充说明
非静态成员函数的底层调用逻辑本身就是隐式将实例地址作为this参数传入函数,你要的显式传实例的写法本质是把这个隐式参数转为显式传递。
内容的提问来源于stack exchange,提问作者reem_mikulsky
相关产品推荐
相关产品推荐

