簡體   English   中英

C ++:指針和抽象數組類

[英]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_ptrshared_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

我個人的經驗法則:僅使用包裝在智能指針中的指針。 在以下情況下,僅使用堆分配的對象:

  • 它們的生存期必須超過其創建范圍,並且副本將太昂貴(幸運的是,C ++ 11具有移動語義,從而消除了許多此類情況)
  • 我必須在它們上調用虛函數

在所有其他情況下,我嘗試盡可能使用堆棧分配的對象和STL容器。

如果您從C ++開始,所有這些乍一看似乎很多,而且完全可以(甚至有必要)在嘗試使用智能指針等之前嘗試完全理解指針。但是,這樣可以節省大量時間,以后再進行調試上。 我還建議您閱讀幾本有關C ++的書-實際上,我以為我了解大多數C ++,直到我讀了第一本書:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM