C++嵌套结构体调用外部父类继承方法 无需重复传this指针的方案
原代码编译失败原因
嵌套结构体In和普通独立结构体没有本质区别,不会默认持有外部类A的实例指针,你调用的A_method是继承自Player的非静态成员方法,必须通过A的实例才能调用,所以直接调用会编译报错。
方案1:thread_local静态指针实现(零额外开销,C++11兼容)
核心思路
利用C++11原生支持的thread_local存储类,在A中维护一个线程局部的当前实例指针,嵌套结构体In不需要持有指针,直接访问这个静态指针调用父类方法,完全避免构造传参,也没有运行时额外开销。
完整实现代码
#include "Player.hh" struct A : public Player { static Player* factory () { return new A; } // 线程局部静态指针,存储当前A的实例 static thread_local A* current_instance; struct In { int x; void do_smthing() { // 直接通过静态指针调用继承的方法 current_instance->A_method(x); } }; virtual void play () { // play方法入口处更新当前实例指针,保证线程安全 current_instance = this; // 后续所有In的实例化和调用都不需要传this In in1; in1.x = 1; in1.do_smthing(); In in2; in2.x = 2; in2.do_smthing(); } }; // 静态成员变量初始化 thread_local A* A::current_instance = nullptr; RegisterPlayer(PLAYER_NAME);
方案优势
- 完全满足需求:所有
In的实例化都不需要手动传this,没有大量In(this)的冗余代码 - 性能开销几乎为0:
thread_local变量的访问效率和普通全局变量一致,没有额外的内存拷贝或者动态分配开销,完全符合高性能场景要求 - 线程安全:多线程同时运行多个
A实例时,线程局部存储会保证不同线程的实例指针互不干扰,不会出现串访问题
方案2:工厂方法封装隐式传参(无静态变量,适用所有场景)
如果你不想引入静态变量,可以在A中封装In的实例化工厂方法,自动注入this指针,对外不需要暴露传参逻辑:
完整实现代码
#include "Player.hh" struct A : public Player { static Player* factory () { return new A; } struct In { friend struct A; int x; void do_smthing() { a_ptr->A_method(x); } private: A* a_ptr; // 构造函数私有,只有A能创建In实例 In(A* ptr) : a_ptr(ptr) {} }; // 封装In的创建接口,自动传this In create_In() { return In(this); } virtual void play () { // 实例化时不需要手动传this auto in1 = create_In(); in1.x = 1; in1.do_smthing(); auto in2 = create_In(); in2.x = 2; in2.do_smthing(); } }; RegisterPlayer(PLAYER_NAME);
方案优势
- 完全没有静态变量,不存在任何线程安全隐患
- 对外调用的代码和普通实例化几乎没有区别,不需要写冗余的
this传参 - 每个
In实例仅多一个指针的存储开销,性能同样极高,满足高性能场景要求
内容的提问来源于stack exchange,提问作者PGalopa
相关产品推荐
相关产品推荐

