如果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