【问题标题】:list of pointers in c++C++中的指针列表
【发布时间】:2010-04-12 22:18:11
【问题描述】:

我想做的是

for (list<cPacket *>::iterator i = cache.begin(); i != cache.end(); i++){
        if( strcmp(i->getName(),id) == 0 ){
            return true;
        }
}

getName 是 cPacket 类的函数,但它不起作用,我也尝试 i.operator-&gt;()-&gt;getName(),然后什么都没有。

谁能帮帮我?

【问题讨论】:

  • @Fred,我刚刚查看了您的编辑。他不知道问题是什么(除了模糊地“不工作”),并且您通过将list::iterator 更改为list&lt;cPacket *&gt;::iterator 编辑他的代码来修复编译器问题。在答案中这样做不是更好吗?
  • 我没有改变这样的事情。模板参数未显示,因为代码未格式化,并且它们被剥离为错误的 HTML。查看原始编辑的来源。我所做的只是代码格式化。

标签: c++ list pointers


【解决方案1】:
(*i)->getName()

就是你要找的。​​p>

【讨论】:

  • @pavlos:您可以将迭代器视为指向容器元素的指针。但在这种情况下,容器中的元素是指针。 (*i) 将为您提供容器中的指针,然后您可以使用 -&gt;getName() 调用它指向的对象上的函数。
  • *i 取消引用一个指针,或者在这种情况下,取消引用一个迭代器。它与 -> 运算符非常相似 - 代替 ptr->getName(),您也可以使用 (*ptr).getName()。在这种情况下,由于您有一个包含指针的迭代器,因此您首先使用 * 取消引用迭代器,然后使用 -> 取消引用指针。
  • 再次抱歉,但我按照您所说的尝试了,然后添加以下行: void ProxyServer::addURLToCache( cPacket *url ){ if( numOfUrlsInCache
  • 如果不查看更多代码,很难判断。可能是 *url 为 NULL 或无效指针。尝试取消引用空指针可能会导致崩溃。
【解决方案2】:

*i 取消对迭代器的引用。由于列表的数据类型为pointer to cPacket,因此您需要应用-&gt; 运算符来访问其成员。正确的优先级需要括号:

(*i)->whatever()

【讨论】:

    【解决方案3】:

    替换

    list<cPacket *>::iterator i
    

    list<cPacket>*::iterator i
    

    【讨论】:

    • list&lt;cPacket&gt;*::iterator 类型在语法上是非法的,更不用说它不等价于cache.begin()cache.end() 的返回类型。这是它无法编译的两个原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2012-06-07
    • 2014-07-16
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多