【发布时间】:2014-01-04 08:00:41
【问题描述】:
所以在我的正文代码中,我创建了一个迭代器来处理指向 Point 对象的指针列表,并且我需要能够将该指针传递给 set_point_one 函数。
list<Point*>::iterator it = on.begin();
l->set_point_one(*it);
set_point_one 函数重载如下:
void set_point_one(const double x, const double y, const double z) { one_.set_xyz(x, y, z); }
void set_point_one(Point &p) { one_.set_xyz(p.get_x(), p.get_y(), p.get_z()); } //trying to get it to use this one
当我运行这段代码时,我得到了错误:
./facet.cc:79:20: error: no matching member function for call to 'set_point_one'
l->set_point_one(*it); //set both end points of the line to the point
~~~^~~~~~~~~~~~~
./line.cc:21:10: note: candidate function not viable: no known conversion from 'value_type' (aka 'Point *') to 'Point &' for 1st argument; dereference the argument with
*
void set_point_one(Point &p) { one_.set_xyz(p.get_x(), p.get_y(), p.get_z()); }
^
./line.cc:20:10: note: candidate function not viable: requires 3 arguments, but 1 was provided
void set_point_one(const double x, const double y, const double z) { one_.set_xyz(x, y, z); } ^
我尝试过使用取消引用,但没有成功。有什么明显的我遗漏的东西,或者是我让它工作以进一步重载函数的唯一方法,因此它还显式地获取一个指向对象的指针?
提前致谢,
最大
【问题讨论】:
-
您确定需要指针列表吗?矢量通常更好,对象容器也是如此。
-
出于好奇,您能否发布一下您是如何填充和清空
list的?我并不是要冒犯他人,但考虑到你提出的问题,你很有可能在那里做错了什么。除非您有充分的理由使用list,否则我会按照 @chris 的建议将其改为vector<Point>。 -
是的,我总是乐于接受建议。我自己一直只使用列表。使用向量的优点是什么
-
@MaxRahm,向量具有连续的内存,这立即将它们置于需要数组的东西的领域。两者之间的性能也进行了很多测试,并且向量在很多情况下获胜。建议是使用向量,除非您已经分析并表明您需要其他东西,或者需要一些用于语义的东西,例如任意键类型的映射。
-
@MaxRahm 从
list<Point*>更改为list<Point>或vector<Point>意味着您不需要动态分配Point对象或确保在删除它们之前delete它们从容器中。这是一个容易出错的过程,尤其是当您考虑异常时。并且补充一下 chris 所说的,vectors 由于连续存储,因此对 CPU 缓存非常友好。我能想到的更喜欢list的几个原因之一是,如果您需要将迭代器(指针)存储到容器中的元素,并且在添加新元素时需要这些迭代器保持有效。
标签: c++ pointers iterator pass-by-reference