将类的实例插入到向量C ++中

时间:2014-05-06 17:56:27

标签: c++ vector

我创建了一个类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编程,所以请帮助我。

1 个答案:

答案 0 :(得分:8)

C ++ new动态分配,表达式的类型将是一个指针。在Java中,这是(几乎)所有对象分配的内容,你只是看不到它。 &#34;名称&#34;在Java中是对通过JVM分配的对象的引用(这个过程非常有趣,我建议阅读它)。但是,Java复制了C ++的语法并使它做了一些非常不同的事情,因此从Java切换到C ++会让人感到困惑。

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

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

完成此向量后,您需要delete使用new分配的所有内容:

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 ++ 1y支持,您也可以

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的函数都不会在其上查找运行时间。