如何在C++中的列表迭代器中调用对象的方法



我在C++11中有一个Point对象列表,我想把每个点的字符串值组合成一个更长的字符串。我有一个方法可以将点作为特定格式的字符串获取,但我不知道如何在遍历列表时调用该方法。

这是我的代码:

list<Point> points;
string results = "";

for (int i = 0; i < num_points; i++) {
Point ptemp = Point(random01(), random01());
points.push_back(ptemp);
results += ptemp.getStr();
}

string log_output = "";
string sep = ",";
list<Point>::iterator iter;
for (iter = points.begin(); iter != points.end(); ++iter) {
// get the first three points in the log.txt format
log_output += *iter.getRawStr(",") + " , ";  
}

我得到这个错误:

error: ‘std::__cxx11::list<Point>::iterator’ {aka ‘struct std::_List_iterator<Point>’} has no member named ‘getRawStr’
177 |     log_output += *iter.getRawStr(",") + " , ";

我试着去掉星号,改为使用to_string((,并通过循环内部单独调用的迭代器方法将循环重新格式化为使用递增整数I,但仍然不起作用。我也尝试过对它进行研究,但我只看到了cout << *iter,而没有看到如何从迭代器中专门调用方法。我该怎么办?

这是运算符优先的情况。.*结合得更紧密,因此这种

*iter.getRawStr(",")

这是吗

*(iter.getRawStr(","))

也就是说,它试图在迭代器上调用getRawStr(而不是它指向的对象(,然后取消引用结果。你想要

(*iter).getRawStr(",")

相当于的[1]

iter->getRawStr(",")

[1]从技术上讲,operator ->可以被覆盖,因此病理类可能会将其定义为做一些与一元*不同的事情,但任何正常、健全的C++类都不应该这样做。

要么写入

log_output += ( *iter ).getRawStr(",") + " , "; 

log_output += iter->getRawStr(",") + " , "; 

否则此表达式

*iter.getRawStr(",")

相当于

* ( iter.getRawStr(",") )

这里的问题是.运算符的优先级高于一元*运算符,因此编译器在std::list::iterator中查找成员getRawStr。您需要使用()来更改此项。或者,您可以使用基于范围的for循环,从而跳过与迭代器相关的代码:

for(auto& point : points)
{
log_output += point.getRawStr(",") + " , ";
}

最新更新