首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合与数据封装

组合与数据封装
EN

Stack Overflow用户
提问于 2011-09-13 22:15:33
回答 3查看 2.7K关注 0票数 3

如果A类和B类是组合关系,是不是意味着通过A类得到的B的具体实例只能通过A类修改,而不能破坏A类的数据封装?或者,组合是否只意味着生命周期绑定,而不是数据封装?

代码语言:javascript
复制
class A
{
   B itsB;
   B* getB() {return &itsB);
}

void AnotherClass::anyOperation()
{
   itsA->getB()->function(); // is this legal ? 
}
EN

回答 3

Stack Overflow用户

发布于 2011-09-13 22:30:51

合成没有严格地指定关于是否应该允许在合成类之外修改合成对象的规则。

封装与控制对类中定义的成员的外部访问有关。一般来说,一个类的字段不应该被外部代码直接访问,如果遵循这个原则,那么允许它被外部代码修改的问题就不会出现。封装和组合在原则上并不相关,因此在您的示例中,B是一个组合到A本身的事实并不意味着itsB不应该在A之外修改。

然而,你应该从1.谁拥有对象itsB?2.允许在A外部修改它是线程安全的吗?它是否破坏了封装?

票数 4
EN

Stack Overflow用户

发布于 2011-09-13 22:27:49

如果B有公共的setter函数,那么在C++中确保没有人通过getB()检索A的B并更改它的值的唯一方法就是让getB()返回一个常量引用。如果它返回一个常量指针,这只是确保您不会更改指针;您仍然可以更改指针所指向的B中的值。

票数 2
EN

Stack Overflow用户

发布于 2011-09-14 15:44:28

用不同的词提到我的问题:

类A有mB和mC成员,其中A和B,A和C是组合关系。

B类和C类是关联关系。

如果我想将特定的实例"mB“链接到(类A的)特定的实例"mC”,允许它们之间进行通信,你会怎么说?

这是否意味着打破A为mB和mC提供的封装?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7403338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档