我创建了一个类Location
,它是类City
和Village
的父类。我有一个vector<Location>
,现在我需要将City
或Village
插入此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编程,所以请帮助我。
答案 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
的函数都不会在其上查找运行时间。