[英]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.