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

C++中能否定义指向类中子对象类的数据成员的指针?

C++中访问嵌套结构体成员的替代方案

C++并不支持&A::B::b_1这种直接指向嵌套结构体成员的成员指针语法,但我们可以通过几种方式实现类似的效果,达到直接修改a.b.b_1的目的。

方案一:组合两个成员指针

我们可以分别定义指向外层结构体成员的指针,和指向内层结构体成员的指针,通过两次成员指针访问完成操作:

struct B
{
  int b_1 = 11;
};

struct A
{
  int a_1 = 1;
  
  B b;
};

int main() {
    A a;
    // 指向A中的b成员(类型为B)
    B A::* ptr_to_b = &A::b;
    // 指向B中的b_1成员(类型为int)
    int B::* ptr_to_b1 = &B::b_1;
    
    // 先通过ptr_to_b拿到a中的B对象,再访问其b_1成员
    (a.*ptr_to_b).*ptr_to_b1 = 10;
    // 如果是A类型的指针,使用->*语法
    A* a_ptr = &a;
    (a_ptr->*ptr_to_b)->*ptr_to_b1 = 20;
}

方案二:用Lambda或函数对象封装访问逻辑

如果觉得两次成员指针访问太繁琐,可以用Lambda封装嵌套成员的访问路径,使用起来更简洁:

struct B
{
  int b_1 = 11;
};

struct A
{
  int a_1 = 1;
  
  B b;
};

int main() {
    A a;
    // 定义一个Lambda,返回A对象中b_1的引用
    auto access_b1 = [](A& obj) -> int& {
        return obj.b.b_1;
    };
    
    // 直接通过Lambda修改目标成员
    access_b1(a) = 10;
}

如果需要更通用的封装,可以编写模板函数对象,适配不同的外层类、内层类和成员类型:

template<typename OuterClass, typename InnerClass, typename MemberType>
struct NestedMember {
    // 外层类中指向内层对象的成员指针
    InnerClass OuterClass::* outer_member;
    // 内层类中指向目标成员的指针
    MemberType InnerClass::* inner_member;

    // 重载()运算符,返回目标成员的引用
    MemberType& operator()(OuterClass& obj) {
        return (obj.*outer_member).*inner_member;
    }

    const MemberType& operator()(const OuterClass& obj) const {
        return (obj.*outer_member).*inner_member;
    }
};

// 使用示例
int main() {
    A a;
    auto b1_accessor = NestedMember<A, B, int>{&A::b, &B::b_1};
    b1_accessor(a) = 10;
}

为什么不能直接用&A::B::b_1?

C++的成员指针是与特定类绑定的,b_1本质是B类的成员,而非A类的成员。A类中只包含一个B类型的对象b,并没有直接包含b_1成员,因此无法直接声明指向A类的b_1成员指针,必须先定位到嵌套的B对象,再访问其成员。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:55:21