簡體   English   中英

C ++:使用指向unordered_map的指針還是僅將其定義為類中此類的成員變量?

[英]C++:using pointer to unordered_map or just defining it as a member variable from this type in a class?

我有一個無法理解的問題:

假設我有一個包含多個成員字段的class System ,其中一個成員字段的類型為unordered_map ,所以當我在頭文件中聲明該類時,我將在頭文件#include <unordered_map>的開頭寫入內容。

現在,我有兩種聲明該字段的方法:

1.std::unordered_map<std::string,int> umap;
2.std::unordered_map<std::string,int>* p_umap;

現在在類的構造函數中,如果我選擇第一個選項,則無需初始化初始化程序列表中的該字段,因為class System的構造函數將調用umap的默認構造函數作為構造類型實例的一部分class System

如果選擇第二個選項,則應使用構造函數new和析構函數在構造函數中(在初始化列表中)初始化字段p_umap ,以刪除此動態分配。

這兩個選項有什么區別? 如果您有一個其中某個字段的類型為unordered_map的類,那么如何聲明此字段? 作為指針還是unordered_map類型的變量?

在您所描述的情況下,似乎第一個選項更可取。 實際上,最有可能的是,無序映射打算由屬於它的數據成員的類擁有 換句話說,其生存期不應超過封裝類的生存期,並且封裝類負責創建和銷毀無序映射。

使用選項1時,所有這些工作都是自動完成的,而使用選項2時,您將必須手動進行處理(並注意正確的復制構造,復制分配,異常安全性,內存泄漏等)。 。 當然,您可以使用智能指針(例如std::unique_ptr<> )將此職責封裝到包裝器中,當智能指針本身超出范圍時,它將負責刪除包裝的對象(此慣用法稱為RAII,這是一個資源獲取的首字母縮寫是初始化 )。

但是,在我看來, 似乎根本不需要指針 您有一個對象,其生存期完全由包含該對象的類的生存期限制。 在這些情況下,您不應僅使用指針,而應將變量聲明為:

std::unordered_map<std::string, int> umap;

讓它不是一個指針 ,直到你需要它的指針。

指針到處都是用戶錯誤。

例如,您忘記提及您的class System也將需要實現

System( const Sysytem& )

System& operator= ( const System& )

或嘗試復制對象時,將出現“不良行為”。

不同之處在於您希望如何訪問umap。 指針可以提供更多的靈活性,但顯然會增加分配方面的復雜性(堆棧與堆,析構函數等)。 如果使用指向umap的指針,則可以執行一些復雜的工作,例如使用相同的umap制作兩個System。 最后,除非有令人信服的理由,否則請選擇KISS。

無需將其定義為指針。 如果這樣做,還必須確保實現復制構造函數和賦值運算符,或者完全禁用它們。

如果沒有特定的理由使其成為指針(並且您沒有顯示任何指針),只需使其成為普通成員變量即可。

暫無
暫無

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

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