封装混乱

时间:2017-03-29 08:24:48

标签: c++

我不确定如何正确封装对象。

示例:

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个双值,该怎么办?我应该使用第二种方法吗?或者声明结构指针,动态分配内存并使用第三种方法?

1 个答案:

答案 0 :(得分:1)

我认为你想要的是这个:

有些班级A包装了另一个班级,Car。应该可以访问A的Car元素,但是,您不能公开Car元素,因为如果有人应该更改该元素,那么包装类可能会出现不一致(如果没有,那么只需要它公开)。

如果是这样,请使用const引用:

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

然后将其称为

const Car& car = instanceOfA.getConstCarReference();

之后,你可以在汽车上使用任何常数调用。

顺便说一句,返回一个指针在大多数情况下是个坏主意。基本上,每当你想到返回指针时,你应该能够清楚地说明为什么返回指针是最好的解决方案。

那就是说,我建议弃用方法名称,如" get"和"设置"。使代码看起来更像发条,而不是处理有机类。我建议你简单地将方法命名为car,如const Car& car() const { return m_car; }中所示,匈牙利符号中的成员变量如你所见(不重要的是你使用匈牙利符号,但我建议明确标记成员变量,at至少如果课程不是很小的话。对于会员来说,使用_carcar_之类的东西也很有效。)