将类的实例插入到vector中

Insert instance of class into the vector C++

本文关键字:vector 插入 实例      更新时间:2023-10-16

我创建了一个类Location,它是类CityVillage的父类。我有一个vector<Location>,现在我需要插入CityVillage到这个vector。我尝试了如下示例:

    vector<Location> locations;
    locations.push_back(new City("New York", 9000, 1, 2));

    vector<Location> locations;
    Location* loc = new City("New York", 9000, 1, 2);
    locations.push_back(loc);

但是没有效果。你能给我提个建议吗?我不是c++程序员,我通常用Java编程,所以请帮助我

c++ new动态分配,表达式的类型将是指针。在Java中,这是(几乎)所有对象分配的底层,只是您看不到而已。Java中的"名称"是对通过JVM分配的对象的引用(这个过程非常有趣,我建议阅读有关它的内容)。然而,Java复制了c++的语法,并让它做了一些非常不同的事情,所以从Java切换到c++是令人困惑的。

由于使用的是多态性,因此需要一个指针的std::vector

std::vector<Location*> locations;
locations.push_back(new City{"New York", 9000, 1, 2});

当你完成这个向量时,你需要用new:

delete你分配的所有东西。
for (auto p : locations) {
    delete p;
}
尽管所有这些最好包装在另一个类中,该类在其析构函数中处理删除操作。

如果你没有其他指向这些对象的指针,你也可以利用unique_ptr,在这种情况下,你不必手动delete

std::vector<std::unique_ptr<Location>> locations;
locations.push_back(std::unique_ptr<Location>{new City{"New York", 9000, 1, 2}});
带有类型别名的

:

using LocPtr = std::unique_ptr<Location>;
std::vector<LocPtr> locations;
locations.push_back(LocPtr{new City("New York", 9000, 1, 2)});

根据你的编译器对c++的支持程度,你也可以这样做

std::vector<std::unique_ptr<Location>> locations;
locations.push_back(std::make_unique<City>("New York", 9000, 1, 2));

另一个需要注意的区别是:由于使用的是指针,因此必须使用->操作符而不是.
locations.at(0)->name(); // assuming class Location{} has a name member function

p->attr等价于(*p).attr

要使你的类多态,它将需要至少有一个虚函数。如果没有别的,你至少应该有virtual ~Location(){}。请注意,任何未标记为virtual的函数都不会在运行时对其进行查找。