Tru*_*eon 1 c++ pointers class member
拿这个代码:
struct mystruct
{
int var;
mystruct() : var(0) {}
};
int main()
{
mystruct ins;
int* p = &ins.var;
*p = 1;
}
Run Code Online (Sandbox Code Playgroud)
那么什么是类成员指针使用的具体非常好的例子呢?
int X::*p = &X::data; /* p contains offset */
X object;
X *objptr = new X;
int i = object.*p;
int j = objptr->*p;
Run Code Online (Sandbox Code Playgroud)
看来你的问题是关于指针到数据成员类型的指针.在C++中,还有指向成员函数类型的指针.这两者在某种抽象层面上有一些共同之处,但除此之外它们是不同的.
指向数据成员类型的指针适用于该类的任何实例.普通指针始终指向该类的特定实例的成员.指向数据成员类型的指针是从类对象开头的"运行时偏移"概念的更高级实现.它是一个相对指针.以这种方式,它与普通指针完全不同,普通指针是绝对指针.
为了说明一个例子,假设你有一个包含三个相同类型成员的类数组x,y并且z
struct Point { int x, y, z; };
Point point_array[N];
Run Code Online (Sandbox Code Playgroud)
并且您需要0在整个数组中设置具有相同名称的所有成员,而不更改任何其他成员.以下是使用指针指向数据成员类型的指针的方法
void zero_members(Point points[], int n, int Point::*m) {
for (int i = 0; i < n; ++i)
points[i].*m = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,通过使用此功能,您可以做到
zero_members(point_array, N, &Point::x);
Run Code Online (Sandbox Code Playgroud)
将所有xs设置为零.或者你可以做到
zero_members(point_array, N, &Point::y);
Run Code Online (Sandbox Code Playgroud)
将所有ys设置为零.您可以使用单个函数完成所有这些操作,同样重要的是,成员选择由运行时参数执行(而不是编译时参数).
你不能用普通的指针做这样的事情.事实上,你不能以任何其他方式做到这一点.