数据成员指针
题目描述
数据成员指针是指向数据成员的指针。更底层地讲,它持有某一数据成员相对于整个对象的地址偏移量。
比如,对于结构体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();
}
}