数据成员指针

题目描述

数据成员指针是指向数据成员的指针。更底层地讲,它持有某一数据成员相对于整个对象的地址偏移量

比如,对于结构体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();
    }
}