数据成员指针
题目描述
数据成员指针是指向数据成员的指针。更底层地讲,它持有某一数据成员相对于整个对象的地址偏移量。
比如,对于结构体struct S { int a, b; };,指针值 &S::b 就代表了成员 b 在整个 S 中的偏移量。
类似指针变量,也存在存储数据成员指针的变量。声明这样的变量的方法是 T S::*mem 初始化器,其中 T 是成员的类型,S 是类(结构体)名,mem 是变量名。比如,初始化指针变量 ptr 持有成员 S::a 偏移量的初始化声明写成:int S::*ptr = &S::a;。
可以通过 .* 运算符或 ->* 运算符使用成员指针。比如对于对象 S obj;,obj.*ptr 即可访问到 obj.a 成员。
请补全下述代码的 translate 成员函数。它接受一个数据成员指针 p 和一个整数 x,并将 p 指向的成员增加 x。
关于输入
若干行。每行包含一个字符 x、y 或 z,后跟一个空格加一个整数 n。
关于输出
记点 A 为三维整数点格中的一个点。初始位置在原点。
对于输入的每一行,将 A 向 x、y 或 z 方向平移 n 个单位,并输出其坐标,格式为 (x, y, z)。
参考答案
#include <iostream>
struct Point {
int x, y, z;
void translate(int Point::*direction, int delta) {
this->*direction += delta;
}
//
void print() {
std::cout << "(" << x << ", " << y << ", " << z << ")\n";
}
};
int main() {
Point p{};
char c;
int x;
while (std::cin >> c >> x) {
int Point::*dir = nullptr;
switch (c) {
case 'x': dir = &Point::x; break;
case 'y': dir = &Point::y; break;
case 'z': dir = &Point::z; break;
}
p.translate(dir, x);
p.print();
}
}