2016-08-30 100 views
2

假設我有一個類MyClass。現在我想使用另一個叫做Animals的類,我可能會這樣做。用C++中的指針初始化

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals animals; 
}; 

不過,我也可以這樣做:

class MyClass 
{ 
public: 
    MyClass(); 
private: 
    Animals* animals; 
}; 

,然後初始化類與構造函數:

animals = new Animals(); 

兩者有什麼不同方法之間的區別,這是更好,爲什麼?在我的使用Animals應該只在MyClass內使用。我的問題主要是關於性能內存,我的意思是通過指針初始化需要更多的資源或不?

+4

這聽起來像一個家庭作業問題。你可以指定你的問題一點點 – TankorSmash

+2

看起來你需要閱讀[this](http://stackoverflow.com/questions/162941/why-use-pointers) – NathanOliver

+0

@TankorSmash這不是一個家庭作業的問題,但我會嘗試改進我的問題 – daljit97

回答

5

如果你考慮如何在一個類中管理內存,它應該變得清晰。當你在你的課堂上申報Animals animal時,空間在你班級的內存佔用空間中保留爲animal。但是當你聲明Animals* animal時,只有你的類的內存佔用空間保留了一個指向Animal的指針。

既不是更好,因爲它取決於你的情況。如果你總是要創建一個動物,並且MyClass擁有它,那麼使用第一種方法,因爲它只需要一次內存分配。如果animals通常可能是空的並且內存是一個問題,那麼您可能需要使用第二種方法。

順便說一句,如果您使用的是C++ 11或更高版本,則可能需要考慮std::unique_ptr<Animal>作爲第二種情況。

1

如果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); 
0

從設計的角度來看,是MyClass一個Animal的容器。在第一個例子中,你總是有一個Animal。在第二個例子中,你可能有或沒有Animal

例如,如果你有一隻鳥籠,你的第一個籠子裏總是有一隻鳥,它不能空着鳥,但第二個例子中你可能有或沒有鳥。

這在數據庫中稱爲Cardinality(0,1)。你可以把它想象成一個Animals的集合,帶有一個或零個元素(即使你沒有數組也很難)。

第二個方面是,在第一個例子中,您總是有相同的Animal,並且您無法自由傳遞它,並且Animal的生存期僅取決於容器。第二個例子允許將Animal移動到一個新的容器中或在兩個不同的容器中具有相同的Animal,並將Animal與容器的壽命分開。

然後,用C++,你必須考慮內存分配和所有權,我們通常使用智能指針來釋放動物。