[英]C++ pass pointers to a Template class function
我是C ++的新手(更多的Java專家)。 我試圖自學C ++指針。 在這里,我創建了兩個類, Person
(基類)和Student
(派生類)。
我試圖將Student
對象放入unordered_map<string, Person>
。 但是遇到一個錯誤。
這是我的代碼:
class Person
{
protected:
string name;
int age;
public:
int getAge()
{
return age;
}
string getName()
{
return name;
}
};
class Student : public Person
{
private:
string grade;
public:
Student(string const &name, int const &age, string const &grade)
{
this -> name = name;
this -> age = age;
this -> grade = grade;
}
int getAge();
};
這是我的主要功能:
int main()
{
unordered_map<string, Person *> students;
Student s("Sam", 26, "A");
Person *p;
p = &s;
students.insert(p -> getName(), p);
return 0;
}
這只是代碼的一部分,我知道它看起來很愚蠢。 但是我只是在學習指針
我包括了<iostream>
和<unordered_map>
庫,並在此處使用namespace std
。
錯誤消息太長。 有人可以指出我在這里犯的錯誤嗎? 或者,我也應該發布該長錯誤消息嗎? 提前致謝。
我更像一個Java家伙。
這是您需要了解的內容:
Person*
是指向人的指針-指針僅在內存中攜帶對象的地址。 級別越低越好。 等效於使用匯編語言使用地址寄存器或索引寄存器。 它不包含有關對象生存期的信息,也不以任何方式影響對象生存期。 它是100%可濫用的。 小心使用(如果有)。
// java code
var x = new Y();
var y = x;
// equivalent c++
auto x = std::make_shared<Y>();
auto y = x;
如果您想要類似Java的行為,則std::shared_ptr<Person>
等效於Java對象引用。 它共享該人的所有權,並允許(實際上在c ++任務中)當所有shared_ptrs超出范圍或已被重置時,銷毀該人。
兩者之間是std::unique_ptr<Person>
,當唯一的一個unique_ptr被銷毀或重置時,它將導致std::unique_ptr<Person>
的自動銷毀。 您不能復制std::unique_ptr
因此不能用於共享對對象的引用。 但是,可以將其轉換為shared_ptr
(這將隱式清空unique_ptr)。
然后有一個std::weak_ptr<Person>
,它是與std::shared_ptr<Person>
相對應的弱項。 不能直接取消引用,而必須先使用lock()
方法將其轉換為shared_ptr
。 這提供了原子性的“存在性測試並鎖定到位”操作。 我們使用它來解決或避免由循環引用(java聲稱由於垃圾回收而沒有這種引用)引起的資源泄漏。
在Java中,當不再有對對象的可達引用時,它將成為垃圾回收的候選對象。 在將來的某個時候,它可能會也可能不會恢復。
C ++有所不同,並且更具可預測性。 重置控制對象生存期的unique_ptr
或最后一個shared_ptr
,將立即在同一線程中執行該對象的析構函數。 這是完全順序的。 這就增加了RAII的可能性,並允許我們使用對象生存期來使代碼無論執行路徑如何都得以執行。
這也可以說是為什么沒有必要finally
在C ++中。 資源清理屬於資源所有者的析構函數。
您的代碼看起來不錯,但只有以下一行:
students.insert(p -> getName(), p);
在這里,您可能想將p
放在單元格p->getName()
,但是不幸的是, std::unordered_map::insert
沒有實例將鍵和值作為兩個參數。 將它們作為一個參數傳遞或使用operator[]
應該有助於:
students[p->getName()] = p;
students.insert({p->getName(), p});
students.insert(std::make_pair(p->getName(), p));
如果可能的話,我個人會選擇第一個選項,以提高可讀性。
上:如@ Jarod42所評論,這里的第一個選項要求值類型是默認可構造的,但並不總是這樣。
int main()
{
unordered_map<string, Person *> students;
Student s("Sam", 26, "A");
Person *p;
p = &s;
pair<string, Person*> item("key", p);
students.insert(item);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.