繁体   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