【问题标题】:Access to STL lists of pointers to objects访问对象指针的 STL 列表
【发布时间】:2020-11-19 05:44:39
【问题描述】:

我想知道如何访问包含指向对象的指针的列表元素。我想在不取消引用的情况下实现这一目标。如果我只是展示我想要的东西,可能会容易得多。所以我有清单:

list<ObjectClass*> nameOfObject;

我有方法:

bool collision(list<ObjectClass*>::iterator&);

我有该方法的内部定义:

{
    if((*nameOfObject)->getSprite()) return true;
    else return false;
}

我想要的是 getSprite 不需要取消引用 nameOfObject 内部方法,所以是这样的:

{
    if((nameOfObject)->getSprite()) return true;
    else return false;
}

我尝试的一切都不起作用。我以为这很容易,但我真的不明白。有任何想法吗?我将添加该列表必须包含指向对象的指针,因为 polimorphysm。

【问题讨论】:

  • 为什么要避免取消引用?您有一个指针,您必须以一种或另一种方式取消引用它才能访问包含的方法/属性。
  • bool collision(list&lt;ObjectClass*&gt;::iterator&amp;); 对我来说没有意义。您应该使用ObjectClass*(或ObjectClass&amp;)或一对迭代器(不应限于std::list,但这是另一回事)...
  • @yeputons 我想在这里使用模板,这是我在列表中有指针的唯一情况,所以我的函数体不同
  • @appleapple 你能写更多细节吗?可能我以愚蠢的方式完成了它,让它变得更好会很棒;)
  • 如果列表只包含非空指针,std::ref 可能比指针en.cppreference.com/w/cpp/utility/functional/reference_wrapper 工作得更好

标签: c++ list stl


【解决方案1】:
list<ObjectClass*>::iterator&

不清楚为什么迭代器是通过引用传递的。

*nameOfObject

这是格式错误的,因为std::list 没有间接运算符。我怀疑您可能已经遮蔽了该变量,而忘记在示例中包含遮蔽变量。

我想要的是getSprite而不需要在方法内部取消引用nameOfObject,

然后你需要在类中有一个带有getSprite 成员函数的类的实例,而不是指向此类的指针/迭代器。如果你确实有一个指针/迭代器,那么就没有办法通过没有间接的指针访问指向的对象。

类似这样的:

(nameOfObject)->getSprite()

确实取消引用nameOfObject-&gt; 是间接成员访问运算符。它也是一个不正确的列表。

有什么想法吗?

避免想要不可能的事情¯\_(ツ)_/¯

【讨论】:

  • 可能值得一提的是,-&gt; 是根据*.定义的,因此(nameOfObject)-&gt;getSprite()根据定义 相当于(*nameOfObject).getSprite()
【解决方案2】:

你通常不会传递 single 迭代器。

如果你想要单个对象,传递单个对象(无论是通过引用还是指针)


我写了一个示例代码,希望对你有帮助。

  • fIter 可能是最接近你目前拥有的东西
  • f 证明你可以在不直接使用迭代器的情况下迭代集合

//
// https://stackoverflow.com/q/63156916/5980430
//

#include <list>
#include <iostream>

class ObjectClass{
   public:
   int spriteID;
   int getSprite(){return spriteID;}
};


//your *collision* function
void collision(ObjectClass& obj){
   std::cout << obj.getSprite() << '\n';
}

void f(std::list<ObjectClass>& objs){
    for (auto& obj : objs){
        collision(obj);
    }
}

//even with iterator, you dereference it before pass in other functions
void fIter(std::list<ObjectClass>& objs){
    for (auto it = objs.begin(); it != objs.end(); ++it){
        collision(*it);
    }
}

int main(){
   std::list<ObjectClass> objects;
   objects.push_back({1});
   objects.push_back({2});
   objects.push_back({3});
   
   f(objects);
    
   fIter(objects);
}

https://wandbox.org/permlink/SgI5ibjaIXd644DH

【讨论】:

  • 顺便说一句,因为 eerorika 的答案已经得到了支持,我也会发布这个答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多