我有一个顶级类,它使用组合来实例化子模块。用户知道顶级类将具有这些子模块。使子模块对象成为公共(public)成员以便用户可以直接调用它们的函数是个好主意吗?
另一种方法似乎是包装它们的函数调用,以保护子模块不被公开,但没有任何封装好处,因为用户无论如何都需要指定子模块。
这是一个带有子模块厨房和浴室的顶级住宅。
// Public member objects
class Kitchen {
public:
void turn_on_tap();
int compute_area();
};
class Bathroom {
public:
void turn_on_tap();
int compute_area();
};
class House {
public:
Kitchen kitchen;
Bathroom bathroom;
int compute_area() { return kitchen.compute_area() + bathroom.compute_area(); }
};
//User code:
House house;
house.kitchen.turn_on_tap();
house.bathroom.turn_on_tap();
house.compute_area() // OK
house.bathroom.compute_area(); // may not want user to be able to do this
// Private member objects
class House {
Kitchen kitchen;
Bathroom bathroom;
public:
void turn_on_kitchen_tap() { kitchen.turn_on_tap(); }
void turn_on_bathroom_tap() { bathroom.turn_on_tap(); }
int compute_area() { return kitchen.compute_area() + bathroom.compute_area(); }
};
//User code:
House house;
house.turn_on_kitchen_tap();
house.turn_on_bathroom_tap();
house.compute_area();
我更喜欢第一种语法,但它意味着将成员对象公开。
第二种方法似乎很乏味,因为我必须编写额外的函数来包装底层函数调用。而且我失去了很好的点分层取消引用,因为用户知道(并且需要知道)底层层次结构。
编辑:但如果我将它们公开,我将在厨房和浴室中公开我不一定希望用户知道的其他后端公共(public)功能。那么我可能不得不将它们设为私有(private)并使用“friend”,这会变得有点难看。
在上面的代码中添加了 compute_area()。
最佳答案
这取决于。如果房子是一个简单的集合,即:
House
的有效值是Kitchen
和Bathroom
的有效值的任意组合。也就是说,没有要保留的House
特定不变量。各个组件自己正确处理自己的不变量,并通过扩展容器的给定点 1。
容器的成员函数只是每个组件的微小包装器,甚至只是返回对组件的引用以供修改。
那么是的,一个简单的struct
(用于默认的公共(public)访问)确实是合适的。这里的“封装”只是冗长的练习。有时您需要的对象只是一堆粘在一起的东西,没有进一步的逻辑。
因此,这是否是一个好主意,您需要自己检查自己的应用程序。
关于c++ - 公开组合成员对象是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54730979/