如果animals
对象的唯一性取决于MyClass
对象上,然后用遏制:
class MyClass
{
public:
MyClass();
private:
Animals animals;
};
如果animals
的存在是独立的,但MyClass
要保持的关联,然后使用指针:
class MyClass
{
public:
MyClass();
private:
Animals * animals;
};
的选择取决于物体自身上ership模型。
有许多考虑因素。
在遏制方法中,animals
的内存与MyClass
对象一起分配。他们总是走在一起,MyClass
完全拥有animals
。
在指针方法中,它们是两个独立的内存块,需要分别分配。这是一个没有任何所有权的协会。纵观MyClass
寿命,多件事情可能会发生:
myclass
不联想到任何Animals
,即animals = nullptr
myclass
可以关联到不同Animals
在不同的时间,即animals = a1; /* ... */; animals = a2;
而且多个对象,要么MyClass
对象或其他类型的对象, may hold the same
animals`指针。
如果animals
对象被销毁,那么这些对象有使用陈旧指针的风险,因此有必要使用某种机制来避免这种情况。
使用指针方法,可以使用运行时多态,这在包容方法中是不可能的。例如
void MyClass::setAnimal(Animal * a) {
animal = a;
}
Animal * a1 = new Lion;
Animal * a2 = new Tiger;
MyClass x1;
x1.setAnimal(a1);
MyClass x2;
x2.setAnimal(a2);
这听起来像一个家庭作业问题。你可以指定你的问题一点点 – TankorSmash
看起来你需要阅读[this](http://stackoverflow.com/questions/162941/why-use-pointers) – NathanOliver
@TankorSmash这不是一个家庭作业的问题,但我会尝试改进我的问题 – daljit97