簡體   English   中英

C ++將指針傳遞給Template類函數

[英]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 ++之間的生命周期差異

在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.

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