[英]C++: pointers and abstract array classes
我對指針還比較陌生,並且已經編寫了此合並功能。 這是有效使用指針嗎? 第二個*two
變量,合並時不應該刪除它嗎? 那將是客戶的任務,而不是實施者的任務?
VectorPQueue *VectorPQueue::merge(VectorPQueue *one, VectorPQueue *two) {
int twoSize = two->size();
if (one->size() != 0) {
for (int i = 0; i < twoSize;i++)
{
one->enqueue(two->extractMin());
}
}
return one;
}
交換函數這樣調用
one->merge(one, two);
將這兩個對象傳遞給它以進行合並
PQueue *one = PQueue::createPQueue(PQueue::UnsortedVector);
PQueue *two = PQueue::createPQueue(PQueue::UnsortedVector);
在您的情況下,完全不需要指針。 您可以簡單地使用引用。
也不必傳入調用成員函數的參數。 您可以使用this
指針獲取在其上調用成員函數的對象。
/// Merge this with other.
void VectorPQueue::merge(VectorPQueue& other) {
// impl
}
通常,使用繼承實現容器並不是真正的首選樣式。 看一下標准庫及其在序列上實現抽象的方法(迭代器)。
乍一看,我看不到任何與指針相關的問題。 盡管我更喜歡使用引用,並且使merge
作為VectorPQueue
的成員函數,所以我不必傳遞第一個參數(正如其他人已經指出的那樣)。 使我感到困惑的另一件事是對one->size() != 0
-如果one
為空,那會是什么問題? 下面的代碼仍然可以正確地將two
插入one
,因為它僅取決於two
的大小。
那將是客戶的任務,而不是實施者
好吧,由您決定如何設計界面。 但是由於該函數僅將two
的元素添加到one
元素中,所以我說它不應刪除它。 順便說一句,我認為這種方法的更好的名字是addAllFrom()
或類似的東西。
: :
我強烈建議您研究一下智能指針。 這些是C ++中減少內存管理工作量的常用技術。 使用裸指針並通過new / delete手動管理它們很容易出錯,很難保證異常安全性,幾乎可以保證您發生內存泄漏等。另一方面,智能指針會自動刪除其包含的指針。需要更多。 出於說明目的,C ++ std庫具有auto_ptr
(如果您的編譯器支持C ++ 11,則為unique_ptr
和shared_ptr
)。 它的用法如下:
{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));
// Do some work with one...:
one->someFunction();
// ...
} // End of scope - one will automatically be deleted
我個人的經驗法則:僅使用包裝在智能指針中的指針。 在以下情況下,僅使用堆分配的對象:
在所有其他情況下,我嘗試盡可能使用堆棧分配的對象和STL容器。
如果您從C ++開始,所有這些乍一看似乎很多,而且完全可以(甚至有必要)在嘗試使用智能指針等之前嘗試完全理解指針。但是,這樣可以節省大量時間,以后再進行調試上。 我還建議您閱讀幾本有關C ++的書-實際上,我以為我了解大多數C ++,直到我讀了第一本書:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.