将“push_back”用于带有“get”函数C++的向量
Posted
技术标签:
【中文标题】将“push_back”用于带有“get”函数C++的向量【英文标题】:Using "push_back" for vector with "get" function C++ 【发布时间】:2020-05-22 16:17:40 【问题描述】:我有一个名为“Region”的类,还有一个名为“Map”的类。 “Map”类有一个名为“regions”的“Region *”类型的向量作为成员。在“地图”类的 .cpp 文件中,我有一个“getRegions”函数,它返回这个“区域”向量。
在 main.cpp 中,我初始化了一个“Region *”,称为“australia”,然后尝试使用“getRegions”函数为向量调用“push_back”函数。我以前从未遇到过使用“push_back”的问题,但是当我测试这个“Region *”是否真的在“regions”向量中时,它总是返回为空。
CLion 编译和运行程序没有任何错误。将“push_back”函数与“get”函数一起调用有错吗?
这里是驱动代码。
int main()
Map map;
Region *australia;
map.getRegions().push_back(australia);
if (map.getRegions().empty())
std::cout << "Empty"; //always prints this for some reason, even though I just pushed it back
else
std::cout << "Not Empty";
return 0;
【问题讨论】:
请发帖minimal reproducible example。我的猜测是getRegions
是不通过引用返回。
map.getRegions().push_back(australia);
-- 此代码不可能正确,因为您正在向向量添加未初始化的指针。
【参考方案1】:
如果没有看到您的所有代码,很难判断,但根据您显示的代码和描述的行为,我的猜测是您的函数看起来像:
auto Map::getRegions() -> std::vector<Region>
// ...
return regions;
这意味着您正在制作向量的副本,并且您正在 push_back
ing 复制。
相反,你需要这样写:
auto Map::getRegions() -> std::vector<Region> &
// ...
return regions;
以便您返回对regions
成员的引用。
【讨论】:
原来是这样的:std::vector<Region *> Map::getRegions() return regions;
但现在我加了和号:std::vector<Region *> &Map::getRegions() return regions;
嗯,好的,但考虑不使用指针。它们是错误的来源,因此除非必要,否则请避免使用它们。【参考方案2】:
阅读按值传递、按引用传递和按指针传递的概念。您的函数getRegions
可能正在按值返回成员, 意思是,您正在创建一个临时副本,并将australia
添加到副本中,而不是实际成员。
【讨论】:
以上是关于将“push_back”用于带有“get”函数C++的向量的主要内容,如果未能解决你的问题,请参考以下文章
std :: vector是否将其值类型的赋值运算符用于push_back元素?