我的问题是,假设我们有两个A和B类。我希望在A类中有一个B的对象。
我应该使用吗,
class A
{
public:
A();
~A();
B* b;
};
或
class A
{
public:
A();
~A();
B b;
};
据我所知,在第一个场景中,我可以使用*b
运算符初始化对象new
,对于第二个场景,我可以使用初始化列表初始化b
我不想使用class B
的默认构造函数。哪个更方便使用?
答案 0 :(得分:9)
这取决于。
即使您使用指针,也可以初始化初始化列表中的成员,但这不是您最关心的问题。
两者都有优点和缺点:
课程内存会更小
你只需要向另一个类提出前向声明 - 不需要在标题中包含其他标题
可以使用B
中的派生对象作为成员
只能使用基类的对象。如果您想从B
每个实例的内存更多
构建B
A
的构造函数
您需要在标题
B
的完整定义
如果我想到更多,我会编辑我的答案。
答案 1 :(得分:6)
在这种情况下,非指针版本更方便。您无需担心在正确的时间调用delete
,因此您无需担心析构函数,复制构造函数和复制赋值运算符。
通常,应尽可能避免动态分配内存。
答案 2 :(得分:5)
第二个更方便,因为您不需要自己管理内存。没有new
,没有delete
。
如果你选择第一个,那么你可能还必须实现三法则(在C ++ 03中):
或者,五法则(在C ++ 11中):
此规则背后的基本理念如下:
因此,除非您有充分的理由说明为什么需要指针版本(例如在您需要多态行为时),您必须采用第二种方法(非指针式方法)。
答案 3 :(得分:2)
使用秒,尽量避免在C ++中尽可能使用new
,除非您使用RAII。
答案 4 :(得分:1)
如果你想在A中使用B类的对象,那么你必须使用第二个。第一个没有在A中给出B类型的对象,它在A中为您提供了类型为B*
的对象。
第二种对于几乎所有目的来说也更方便。只在必要时使用指针,即使使用智能指针而不是B*
,资源处理也更方便。