C++ 将类的实例插入向量C++;

C++ 将类的实例插入向量C++;,c++,vector,C++,Vector,我创建了一个classLocation,它是classCity和Village的父类。我有一个向量,现在我需要将城市或村庄插入这个向量。例如,我尝试了以下方法: vector<Location> locations; locations.push_back(new City("New York", 9000, 1, 2)); 矢量位置; 地点。推回(纽约市(“纽约”,9000,1,2)); 或 矢量位置; 地点*loc=纽约市(“纽约”,9000,1,2); 位置

我创建了一个class
Location
,它是class
City
Village
的父类。我有一个
向量
,现在我需要将
城市
村庄
插入这个
向量
。例如,我尝试了以下方法:

    vector<Location> locations;
    locations.push_back(new City("New York", 9000, 1, 2));
矢量位置;
地点。推回(纽约市(“纽约”,9000,1,2));

矢量位置;
地点*loc=纽约市(“纽约”,9000,1,2);
位置。推回(loc);

但什么都不管用。你能给我一个建议吗?我不是C++程序员,我通常用java编程,所以请帮助我。< /P> < P> C++ >代码>新< /Cord>动态分配,表达式的类型将是指针。在Java中,这是(几乎)所有对象分配的秘密所在,您只是看不到而已。Java中的“名称”是对通过JVM分配的对象的引用(该过程非常有趣,我建议阅读相关内容)。但是,java复制C++的语法,并使它做了一些非常不同的事情,所以从java切换到C++是很不容易的。 因为您使用的是多态性,所以需要一个
std::vector
指针

std::vector<Location*> locations;
locations.push_back(new City{"New York", 9000, 1, 2});
尽管所有这些最好包装在另一个类中,该类在其析构函数中处理删除

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

std::vector<std::unique_ptr<Location>> locations;
locations.push_back(std::unique_ptr<Location>{new City{"New York", 9000, 1, 2}});
p->attr
相当于
(*p).attr


要使类具有多态性,它至少需要有一个虚拟函数。如果没有其他功能,您至少应该有
virtual~Location(){}
。请注意,任何未标记为
virtual
的函数都不会对其执行运行时查找。

使用存储指针的容器来存储实例(
std::vector
)使用后不要忘记删除分配的对象。你确定需要动态分配吗?@JohnDibling OP使用多态基类。
位置。向后推(使_唯一(“纽约,9000,1,2))
似乎最简单。没错,我会添加它,尽管它只在C++14中出现,但在那之前,它很容易在C++11中模拟。
模板std::uniqueptr makeunique(U…v){return std::uniqueptr(new T(std::forward(v)…);}
(没有人关心数组版本,但这也很容易做到)谢谢你的精彩解释。这非常有用。
for (auto p : locations) {
    delete p;
}
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)});
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