gpt4 book ai didi

C++:在显示一些数据时避免 setter/getter

转载 作者:行者123 更新时间:2023-11-30 03:44:03 25 4
gpt4 key购买 nike

假设我有一个类代表一个人:

class Person {
string name;
int age;
}

我想使用 Printer 类在屏幕上显示有关人员的信息

class Printer {
public:
void print(string toPrint) { cout << toPrint << endl; }
}

以下哪种方法更好:

  1. Person 添加 getter,然后从外部调用它们(例如 main 方法):

    printerInstance.print(personInstance.getName + ", " + personInstance.getAge);
  2. 将 getter 添加到 Person 但从 Printer 调用它们(通过重载 print 方法)

    printerInstance.print(personInstance);
    // ...
    Printer::print(Person person) {
    print(person.getName + ", " + person.getAge);
    }
  3. 要使 Person 依赖于 Printer(我们避免使用 getter)并调用:

    personInstance.print(printerInstance);
    // ...
    Person::print(Printer printer)
    {
    printer.print(getName + ", " + getAge);
    }

最佳答案

我通常会听从 Scott Meyer 的建议“更喜欢非成员非友元函数而不是成员函数”。

他说更高级别的封装是指最少数量的函数可以访问类的私有(private)成员,这听起来像是一个合理的定义。

所以在我看来,解决方案 2 是您提出的最佳方案(但我更喜欢 operator<< )。

然而,有一个重要的注意事项:如果您必须为打印机公开(通过 setter/getter )的数据是您不会以其他方式公开的数据,那么这将不再适用。封装的想法是保护您的内部结构,以便您可以在将来更改您的实现。如果您只为打印机公开内部结构,您就有可能让客户使用您的 getter,并且以后将无法删除它们。在这种情况下,一个 toStringtoStream方法似乎更好。

如果您确定将来您将始终拥有 getAge和一个 getName方法,即使您停止使用 int agestd::string name在内部(例如从出生日期计算年龄)就可以了。

关于C++:在显示一些数据时避免 setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35723582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com