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
相关产品推荐
相关产品推荐

