gpt4 book ai didi

c++ - 如何在C++中实现类组合?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:43 25 4
gpt4 key购买 nike

如果我理解正确的话,我们至少有两种不同的方式来实现合成。 (为简单起见,排除了使用智能指针实现的情况,我几乎不使用STL,也没有学习的欲望。)

让我们看看维基百科example :

class Car
{
private:
Carburetor* itsCarb;
public:
Car() {itsCarb=new Carburetor();}
virtual ~Car() {delete itsCarb;}
};

所以,这是一种方式 - 我们有一个指向对象的指针作为私有(private)成员。可以将其重写为如下所示:

class Car
{
private:
Carburetor itsCarb;
};

在那种情况下,我们有一个对象本身作为私有(private)成员。 (顺便说一句,从术语的角度来看,我把这个实体称为对象是对的吗?)

在第二种情况下,不必隐式调用默认构造函数(如果需要调用非默认构造函数,可以在初始化列表中调用)和析构函数。但这不是什么大问题......

当然,在某些方面,这两种情况的差异更为明显。例如,在第二种情况下,禁止从 Car 类的 const 方法调用 Carburetor 实例的非常量方法...

是否有任何“规则”来决定使用哪一个?我错过了什么吗?

最佳答案

In that case we have an object itself as private member. (By the way, calling this entity as object am I write from the terminology point of view?)

是的,您可以说类的“一个对象”或“一个实例”。

您还可以谈论“按值”而不是“按指针”包含数据成员(因为“按指针”和“按值”是谈论传递参数的正常方式,因此我希望人们会理解那些适用于数据成员的术语)。

Is there any "rules" to decide which one to use? Am I missed something?

如果实例被多个容器共享,那么每个容器都应该通过指针而不是值来包含它;例如,如果一个 Employee 有一个 Boss 实例,如果多个 Employee 实例共享同一个 Boss,则通过指针包含 Boss。

如果数据成员的生命周期与容器的生命周期不同,则通过指针包含它:例如,如果数据成员在容器之后实例化,或在容器之前销毁,或销毁-和- 在容器的生命周期内重新创建,或者如果数据成员为 null 有意义。

另一种情况下,您必须通过指针(或通过引用)而不是通过值来包含数据成员的类型是抽象基类。

通过指针包含的另一个原因是,这可能允许您在不重新编译容器的情况下更改数据成员的实现。例如,如果 Car 和 Carburetor 在两个不同的 DLL 中定义,您可能希望通过指针包含 Carburetor:因为这样您就可以通过安装不同的 Carburetor.dll 来更改 Carburetor 的实现,无需重建 Car.dll

关于c++ - 如何在C++中实现类组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com