2015-05-12 174 views
-1

所以我有以下的類...如何檢查一個對象是否已經在C++中初始化/創建?

class Pet 
{ 
    public: 
     Pet() : id(0), 
      name("New Pet") 
     { 

     } 

     Pet(const int new_id, const std::string new_name) : id(new_id), 
      name(new_name) 
     { 

     } 

     Pet(const Pet new_pet) : id(new_pet.id), 
      name(new_pet.name) 
     { 

     } 
    private: 
     const int id; 
     const std::string name; 
}; 

某處在我的代碼,然後創建這個類,像這樣的情況下...

Pet my_pet = Pet(0, "Henry"); 

後來在我的代碼,事件應該會導致這個寵物被刪除。 delete(my_pet);

如何檢查是否my_pet已經初始化...

會是這樣的工作?

if(my_pet == NULL) 
{ 
    // Pet doesn't exist... 
} 
+0

'my_pet'沒有按不需要刪除,因爲它不是一個動態分配的對象。你的意思是'Pet * my_pet = new Pet(0,「Henry」);'? – Levi

+2

你可能應該把你的'const Pet'和'const std :: string'參數作爲引用,在這裏'Pet(const Pet new_pet)'和這裏'Pet(const int new_id,const std :: string new_name)'for效率,這裏沒有必要複製數據。 – thelink2012

回答

3

假設你的意思

Pet* my_pet = new Pet(0, "Henry"); 

,而不是Pet my_pet = Pet(0, "Henry");
您可以初始化你Pet對象NULL(或nullptr for C++ 11)像這樣:

Pet* pet = NULL; // or nullptr 

,後來分配給它的Pet一個實例:

pet = new Pet(0, "Henry"); 

這允許你檢查pet值,而不調用未定義行爲(通過未初始化的變量):

if (pet == NULL) // or nullptr 
{ 
    ... 
} 
+0

這是我在找的,感謝@Levi。 我將如何去強制刪除寵物... 例如,說一個寵物被分配給my_pet。但是在某些時候,我想讓my_pet沒有寵物。 這項工作......? my_pet = NULL; – Ricky

+1

你可以叫'刪除寵物' – Levi

+0

非常感謝,應該工作得很好。 – Ricky

0

delete(my_pet);沒有意義,既不使用的簽名(應delete my_pet;,如果有效)。

與您的代碼

Pet my_pet = Pet(0, "Henry"); 

沒有動態內存分配的參與,所以你永遠不要需要調用delete my_pet;

的對象實例將被破壞,一旦在這裏你叫Pet my_pet = Pet(0, "Henry");是範圍剩下。


至於你的意見「我將如何去強迫刪除寵物。,您應該使用dynamic memory management smart pointers,而不是打電話new Pet(),並自行刪除約迫使刪除。

如果你確實需要動態內存分配Pet,而使用類似

std::unique_ptr<Pet> my_pet(new Pet(0, "Henry"));` 
+0

'delete(my_pet)'完全有效 – Levi

+0

@Levi當然?你注意到'my_pet'甚至不是一個指針變量,不是嗎? –

+0

好吧,如果'刪除my_pet'是有效的,那麼假設'delete(my_pet)'也是安全的 – Levi

相關問題