You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

最新C++中如何实现类成员函数树形分组且可访问类所有成员?

优化实现方案

核心优化思路

  • 利用C++11及以后版本中嵌套类默认是外围类友元的特性,嵌套类可以直接访问外围类的所有公有、私有成员,无需额外写转发函数
  • 给分组/子分组结构体添加带参构造函数,自动绑定外围类实例指针,无需在主类构造函数中手动逐个赋值
  • 直接将分组函数的实现写在对应嵌套类中,省去原本的私有转发函数和重复的调用逻辑

优化后完整代码

#include <iostream>

class tClass
{
public:
    tClass() : Grp1(this) {};
    ~tClass() = default;

    struct Grp1
    {
        explicit Grp1(tClass* parent) : SubGrp1(parent), SubGrp2(parent), SubGrp3(parent) {}

        struct SubGrp1
        {
            explicit SubGrp1(tClass* parent) : me(parent) {}
            void Fun1() { std::cout << "Group1_SubGroup1_Function1\n"; /* 可直接访问me的所有私有成员,比如me->private_val */ };
            void Fun2() { std::cout << "Group1_SubGroup1_Function2\n"; };
            void Fun3() { std::cout << "Group1_SubGroup1_Function3\n"; };
        private:
            tClass* me;
        } SubGrp1;

        struct SubGrp2
        {
            explicit SubGrp2(tClass* parent) : me(parent) {}
            void Fun1() { std::cout << "Group1_SubGroup2_Function1\n"; };
            void Fun2() { std::cout << "Group1_SubGroup2_Function2\n"; };
        private:
            tClass* me;
        } SubGrp2;

        struct SubGrp3
        {
            explicit SubGrp3(tClass* parent) : me(parent) {}
            void Fun1() { std::cout << "Group1_SubGroup3_Function1\n"; };
        private:
            tClass* me;
        } SubGrp3;
    } Grp1;

private:
    // 原有冗余的私有转发函数全部可以删除
    int private_val = 10; // 类私有成员可直接被所有嵌套类访问
};

int main()
{
    tClass aClass;
    // 调用方式和原有代码完全一致,无需修改业务逻辑
    aClass.Grp1.SubGrp1.Fun1();
    aClass.Grp1.SubGrp1.Fun2();
    aClass.Grp1.SubGrp1.Fun3();

    aClass.Grp1.SubGrp2.Fun1();
    aClass.Grp1.SubGrp2.Fun2();
                    
    aClass.Grp1.SubGrp3.Fun1();

    return 0;
}

补充说明

注意:如果需要兼容C++03及更早标准,只需在tClass中显式声明对应嵌套类为友元即可,其余逻辑保持不变。
如果子分组结构高度相似,还可以使用模板进一步减少重复代码;如果必须保留原有私有函数的实现逻辑,仅删除手动赋值me指针的步骤,也能减少一半以上的冗余代码。

内容的提问来源于stack exchange,提问作者mnd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:00:04