封装混乱

Encapsulation confusion

本文关键字:混乱 封装      更新时间:2023-10-16

我不知道如何正确封装对象。

例:

struct Car {
int wheels = 0;
int doors = 0;
};
class A{
Car myCar;
public:
// 1st method
Car getCar() const { return myCar; }
void setCar(Car c) { myCar = c; }
// 2nd method
Car &getCarReference() { return myCar; }
// 3rd method
Car *getCarPointer() { return &myCar; }
};

据我了解,第一种方法复制了我的结构,如果结构很小,如图所示,这很好。但是,如果结构包含 100 000 个双精度值怎么办?那么我应该使用第二种方法吗?还是声明结构指针,动态分配内存并使用第三种方法?

我假设你想要的是这个:

某个类,A,包装另一个类,汽车。应该可以访问 A 的 Car 元素,但是,您不能公开 Car 元素,因为如果有人应该更改该元素(如果没有,那么只需将其公开),包装器类可能会不一致。

如果是这样,请使用常量引用:

const Car& getConstCarReference() const { return myCar; }

然后这被称为

const Car& car = instanceOfA.getConstCarReference();

之后,您可以在汽车上使用任何持续呼叫。

顺便说一下,在大多数情况下,返回指针是一个坏主意。从本质上讲,每当您想到返回指针时,您应该能够清楚地论证为什么返回指针是最佳解决方案。

也就是说,我建议放弃像"get"和"set"这样的方法名称。使代码看起来更像发条,而不是处理有机类。我建议你将该方法简单地命名为 car,如const Car& car() const { return m_car; }所示,匈牙利表示法的成员变量如您所见(使用匈牙利表示法并不重要,但我建议清楚地标记成员变量,至少如果类不是很小。为成员使用诸如_carcar_之类的东西也很好用。