【问题标题】:c++ How to pass iterator pointer to function that expects the object by referencec ++如何将迭代器指针传递给期望通过引用的对象的函数
【发布时间】: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&lt;Point&gt;
  • 是的,我总是乐于接受建议。我自己一直只使用列表。使用向量的优点是什么
  • @MaxRahm,向量具有连续的内存,这立即将它们置于需要数组的东西的领域。两者之间的性能也进行了很多测试,并且向量在很多情况下获胜。建议是使用向量,除非您已经分析并表明您需要其他东西,或者需要一些用于语义的东西,例如任意键类型的映射。
  • @MaxRahm 从list&lt;Point*&gt; 更改为list&lt;Point&gt;vector&lt;Point&gt; 意味着您不需要动态分配Point 对象或确保在删除它们之前delete 它们从容器中。这是一个容易出错的过程,尤其是当您考虑异常时。并且补充一下 chris 所说的,vectors 由于连续存储,因此对 CPU 缓存非常友好。我能想到的更喜欢list 的几个原因之一是,如果您需要将迭代器(指针)存储到容器中的元素,并且在添加新元素时需要这些迭代器保持有效。

标签: c++ pointers iterator pass-by-reference


【解决方案1】:

*it 取消引用迭代器,返回对象,它指向。在你的情况下 - Point*

由于您的函数采用Point&amp;,您需要再次取消引用它。意义

// not mandatory -v---v
l->set_point_one(*(*it));

【讨论】:

  • “非强制性”注释是什么意思?您是指括号是可选的吗?如果是这样,哪种风格更好?
  • @User - 是的,括号是可选的。更好的风格 - 您更喜欢的风格,或者您正在工作的当前项目/公司对类似案例的风格有特殊要求。我会避免使用括号,添加它们只是为了让我的答案更清楚发生了什么。
【解决方案2】:

希望以下示例有所帮助:

using namespace std ;

void test(int* &p)
{
    cout << *p << endl ;
}

int main()
{
    std::list<int*> lp ;
    int *p1,*p2 ;
    p1 = new int(100201)  ;
    p2 = new int(12345)  ;

    lp.push_back(p1) ;
    lp.push_back(p2) ;
    std::list<int*>::iterator it = lp.begin();
    test(*it) ;
}

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 2019-09-16
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2014-12-21
    • 2019-10-30
    相关资源
    最近更新 更多