如果A类和B类是组合关系,是不是意味着通过A类得到的B的具体实例只能通过A类修改,而不能破坏A类的数据封装?或者,组合是否只意味着生命周期绑定,而不是数据封装?
class A
{
B itsB;
B* getB() {return &itsB);
}
void AnotherClass::anyOperation()
{
itsA->getB()->function(); // is this legal ?
}发布于 2011-09-13 22:30:51
合成没有严格地指定关于是否应该允许在合成类之外修改合成对象的规则。
封装与控制对类中定义的成员的外部访问有关。一般来说,一个类的字段不应该被外部代码直接访问,如果遵循这个原则,那么允许它被外部代码修改的问题就不会出现。封装和组合在原则上并不相关,因此在您的示例中,B是一个组合到A本身的事实并不意味着itsB不应该在A之外修改。
然而,你应该从1.谁拥有对象itsB?2.允许在A外部修改它是线程安全的吗?它是否破坏了封装?
发布于 2011-09-13 22:27:49
如果B有公共的setter函数,那么在C++中确保没有人通过getB()检索A的B并更改它的值的唯一方法就是让getB()返回一个常量引用。如果它返回一个常量指针,这只是确保您不会更改指针;您仍然可以更改指针所指向的B中的值。
发布于 2011-09-14 15:44:28
用不同的词提到我的问题:
类A有mB和mC成员,其中A和B,A和C是组合关系。
B类和C类是关联关系。
如果我想将特定的实例"mB“链接到(类A的)特定的实例"mC”,允许它们之间进行通信,你会怎么说?
这是否意味着打破A为mB和mC提供的封装?
https://stackoverflow.com/questions/7403338
复制相似问题