2016-10-10 47 views
0

的對象我做了這個類構造使得指針類型

class Person { 

public: 

    Person(const std::string& name, const std::string& email, const std::string& city) 
    : name(name), email(email), city(city) { 
    } 

    bool hasCity() const { 
     return city.compare("") == 0; 
    } 

    void print() const { 
     std::cout << name + " <" + email + ">"; 
     if(hasCity()){ 
      std::cout << ", " + city; 
     } 
     std::cout << std::endl; 
    } 

    bool equalTo(const Person& comparedPerson) const { 
     return email.compare(comparedPerson.email) != 0; 
    } 

    bool equalId(std::string comparedId){ 
     return email.compare(comparedId) != 0; 
    } 

    const std::string name; 
    const std::string email; 
    const std::string city; 
}; 

什麼是我的問題是,當我嘗試與創建新的聯繫人:

const Person& newPerson = (const Person &) new Person(name, email, city); 

我得到這個錯誤

error: invalid cast of an rvalue expression of type 'Person*' to type 'const Person&' 
    const Person& newPerson = (const Person &) new Person(name, email, city); 

我想爲什麼新創建的Person是Person而不是Person。

+0

看看智能指針:'std :: unique_ptr'和'std :: shared_ptr'。這是一個更好的實踐來操作分配的內存 – Garf365

+0

只需做'const Person&newPerson = Person(name,email,city);' –

+0

您還應該重載插入操作符('<<')來代替'print'方法。 – erip

回答

9

new返回指向對象的指針,而不是對象。 Person*而不是Person。 真的,雖然你將它標記爲C++ 14,但你不應該使用帶有動態分配的原始指針。

只需創建具有自動存儲時間變量:

Person newPerson(name, email, city); 

或者,如果你需要指針,使用std::unique_ptrstd::shared_ptr其處理內存管理爲您提供:

#include <memory> 
auto ptr = std::make_unique<Person>(name, email, city); 
+0

哇。 Thx這麼多。正如你已經意識到,在新的C++ :),這只是做伎倆! –

2

有兩個市長用C++創建「人員」的方法。 (或者這更好地稱爲:實例化對象)

可以簡單地使用具有自動存儲持續時間的對象。你可以像這樣創建它。

Person p(name, email, city); 

您還可以創建引用和指針對象:

Person* pP = &p; 
Person& rP = p; 

但要注意:這個對象現在將刪除當你離開目前的範圍,並且所有引用和指針,以它將失效。

另一種方法是通過使用動態內存分配來分配具有動態存儲持續時間的對象。

簡單方式是使用新的。

Person* p = new P(name, email, city); 

儘管當您手動創建新的原始指針,你必須手動刪除他們某處

delete p; 

動態內存中的更好解決分配的對象是智能指針。那些將是shared/unique指針。他們刪除了手動刪除這些對象的需要。你可以創建這樣的。

auto p = std::make_shared<Person>(name, email, city); 

或使用make_unique作爲唯一指針。

它們最初看起來像普通的指針,但它們後面有一些機制,這使得它們更安全。有關這些內容的詳細信息,請閱讀共享和唯一指針及其差異。

+0

請儘量不要傳播過時和不準確的「堆棧vs堆」! –

+0

@LightnessRacesinOrbit你是否在意詳細說明這一點?我的意思是我在這裏沒有「vs」來討論優點/缺點。只是提及這兩種類型,因爲我經常看到來自java過來和默認爲「新」只是不知道你可以聲明局部變量。所以我想我只是提到了另一種方式。我想在這裏給他們名字堆棧/堆看起來很準確。 – Hayt

+0

http://stackoverflow.com/a/4687324/560648 http://stackoverflow.com/a/14172583/560648 http://stackoverflow.com/q/6524888/560648 –