C++ 访问放在类中的对象的方法

C++ 访问放在类中的对象的方法,c++,class,attributes,C++,Class,Attributes,类A拥有类c的实例c。另一个类B必须通过c::setBlah()修改c方法 创建访问器C getC()是否不好然后使用A.getC().setBlah() 或者我应该创建一个方法a::setBlah()将调用C::setBlah()?如果有几种类似的方法,不是很烦人吗?如果C有许多类似的方法可以被A之外的类调用,我肯定不会将它们添加到A中。我更喜欢尽可能减少接口。如果这些更改是相关的,并且是一起完成的,那么您可以向a添加一个专用的函数,以一次执行对C的所有调用,并以直观的名称从逻辑上收集所有这些

A
拥有类
c
的实例
c
。另一个类
B
必须通过
c::setBlah()修改
c
方法

创建访问器
C getC()是否不好A
中编码>然后使用
A.getC().setBlah()


或者我应该创建一个方法
a::setBlah()将调用
C::setBlah()?如果有几种类似的方法,不是很烦人吗?

如果C有许多类似的方法可以被A之外的类调用,我肯定不会将它们添加到A中。我更喜欢尽可能减少接口。如果这些更改是相关的,并且是一起完成的,那么您可以向a添加一个专用的函数,以一次执行对C的所有调用,并以直观的名称从逻辑上收集所有这些更改


这样的设置也提出了一个问题:为什么B需要接触a的成员C?也许你的设计不太正确-C应该是B的成员而不是a的成员吗?

如果C有许多类似的方法可以被a之外的类调用,我绝对不会将这些方法添加到a中。我更喜欢尽可能减少接口。如果这些更改是相关的,并且是一起完成的,那么您可以向a添加一个专用的函数,以一次执行对C的所有调用,并以直观的名称从逻辑上收集所有这些更改

这样的设置也提出了一个问题:为什么B需要接触a的成员C?也许您的设计不太正确-C应该是B的成员而不是a吗?

a方法
C getC()
创建
c
的副本,因此调用
a.getC().setBlah()
将修改
c
的副本,而不是
a

a方法
c getC()
创建
c
的副本,因此调用
a.getC().setBlah()
将修改
c
的副本,而不是
a

c
的副本,就像大多数“做X不好吗?”问题一样,答案是它完全取决于给定的情况

有时使用
getC()
类函数可能是一个非常糟糕的主意,因为它破坏了封装。其他情况下,这可能是完全正确的,因为封装该细节可能无关紧要,编写大量包装函数会增加必须编写的代码量

选择对给定情况最有意义的选项。在我编写的代码中,我采用了两种方法

如果您选择
getC()
路线,请确保返回一个引用;否则,您将修改一个听起来不像您想要的副本。或者,你可以考虑制作<代码>::C/<代码>公有,这样你就不需要任何功能了。

一个第三考虑的选项是继承从<代码> c>代码>,这就消除了<代码> GETCH()/<代码>或包装函数在<代码> < < /代码> .< /p>

中的需要,因为大多数“x做不好”问题,答案是完全取决于给定的情况。p> 有时使用

getC()
类函数可能是一个非常糟糕的主意,因为它破坏了封装。其他情况下,这可能是完全正确的,因为封装该细节可能无关紧要,编写大量包装函数会增加必须编写的代码量

选择对给定情况最有意义的选项。在我编写的代码中,我采用了两种方法

如果您选择
getC()
路线,请确保返回一个引用;否则,您将修改一个听起来不像您想要的副本。或者,你可以考虑制作<代码>::C/<代码>公有,这样你就不需要任何功能了。

一个第三个考虑的选项将继承从<代码> c>代码>,这就消除了在<代码> < < />代码>中的<代码> GETCH()/代码>或包装器功能的需求。

我认为,这个决定主要取决于<代码> C>代码>是内部细节类型(使用<代码>::SETBLAH)(/Cuff>),还是一些公共接口(使用<代码> .gcf())
)。当然,这是一个模糊的概念,如果你不是在编写一个库,那么将内部细节作为一个公共界面或者在这种情况下将内部细节作为一个公共界面并不是一个问题。谢谢!我会想一想:)我会说,决策应该主要取决于
C
是内部细节类型(使用
A::setBlah()
),还是某个公共接口(使用
A.getC().setBlah()
)。当然,这是一个模糊的概念,如果你不是在编写一个库,那么将内部细节作为一个公共界面或者在这种情况下将内部细节作为一个公共界面并不是一个问题。谢谢!我会考虑的:)