C++ 中的指针可用于聚合和组合。正如Douglas 正确指出的那样,区别在于对象的生命周期是否相互关联。换句话说:当父进程被销毁时,子进程是否也被销毁?答案“Yes”代表组合,“No”代表聚合。
\n\nC++ 中的指针可以表示另一个(动态创建的)对象的所有权,或者仅引用其他人拥有的对象。让\xe2\x80\x99s 显示示例中的差异。我\xe2\x80\x99 将解释为什么指针对于每种类型的关系都很有用。
\n\n在这种情况下,最好只前向声明class Childbeforeclass Parent声明,并且child可以在 的生命周期内设置和重新设置成员Parent。
class Child;\n\nclass Parent\n{\npublic:\n Parent(Child* ch) : child(ch) {}\n Parent() : child(NULL) {}\n void setChild(Child* ch) { child = ch; }\nprivate:\n Child* child;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n最长的例子表明我们可以child使用指针动态创建和销毁。\xe2\x80\x99s 生命周期child与Parent. 然而,由于指针的存在,我们仍然可以child在生命周期内交换 ren 。Parent与下面的替代方案不同,该解决方案还允许仅class Child在头文件中进行前向声明。
// --- header file\nclass Child;\n\nclass Parent\n{\npublic:\n Parent();\n ~Parent();\n void renewChild();\nprivate:\n Child* child;\n};\n\n// --- source file\n#include "child.h"\n\nParent::Parent()\n : child(new Child)\n{\n}\n\nParent::~Parent()\n{\n delete child;\n}\n\nvoid Parent::renewChild()\n{\n delete child;\n child = new Child;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n此示例遵循三/五/零规则。我故意让用户来实现缺少的推荐方法,使这个答案与方言无关并且尽可能简单。
\n\n您无需手动编写构造函数和析构函数,只需child在类声明中进行声明,然后让编译器为您完成构造和析构。只要class Child\xe2\x80\x99s 构造函数不需要参数(否则你\xe2\x80\x99d 需要手动编写class Parent\xe2\x80\x99s 构造函数)并且class Child在 的声明之前完全声明,这就是有效的class Parent。
#include "child.h"\n\nclass Parent\n{\nprivate:\n Child child;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n为了完整起见,使用指针进行聚合的替代方法是使用引用。child但是,这会阻止在对象的生命周期内交换ren Parent。
class Child;\n\nclass Parent\n{\npublic:\n Parent(Child& ch) : child(ch) {}\nprivate:\n Child& child;\n};\nRun Code Online (Sandbox Code Playgroud)\n