C++ 允许定义指向类成员的指针,例如:
struct A
{
int i;
};
void a()
{
int A::*p = &A::i;
}
但是如果我想要一个指向像这样更深“级别”的成员的指针怎么办?struct A
{
int i;
struct B{int j;};
B b;
};
void a()
{
int A::*p = &A::b::j;
}
从理论上讲,如果指向成员的指针从对象的开头编译为偏移量,这可能很容易被语言支持,尽管像虚拟/菱形继承(钻石问题)之类的东西可能会使这过于复杂在没有性能损失或未定义行为的情况下实现这一目标的最简单方法是什么?
我的第一个想法是仅使用偏移量并使用对象上的原始指针,但这似乎可能不是定义的行为,并且还会使编译器无法检测我是否指向具有正确类型的实际字段
最佳答案
您只能为给定类的实际数据成员定义指向数据成员的指针。
你声明了一个嵌套类类型在这里并不是特例:你可以提取一个指针作为 A::B
的数据成员。并将指向数据成员的指针应用到 b
A::B
的成员(类型为 A
)目的:
#include <iostream>
struct A {
int i;
struct B{ int j; };
B b;
};
int main() {
A a{1, {42}}; // a.b.j is 42
// Declare a pointer-to-data-member of B (which
// is a nested class in A).
int A::B::*p = &A::B::j;
// Apply to an actual 'B' object to retrieve
// the data member value pointed to.
std::cout << a.b.*p; // 42
}
但是,如果您想在 A
上应用指向数据成员的指针,对象,你能得到的最好的就是指向数据成员 b
的指针.对于嵌套类对象,您始终可以使用指向数据成员指针的嵌套指针:
int main() {
A a{1, {42}}; // a.b.j is 42
A::B A::*pb = &A::b;
int A::B::*pj = &A::B::j;
std::cout << (a.*pb).*pj; // 42
}
关于c++ - 指向成员的成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64916237/