【问题标题】:C++ - Overloading [] operator for a list of object pointersC++ - 为对象指针列表重载 [] 运算符
【发布时间】:2016-11-25 16:51:39
【问题描述】:

我有这个作为 TASK 类的成员。

list<Stimulation*> listOfStimulations;

还有我的类定义的其余部分;

class Task
{
public:
    Task();
    Task(const Task& obj);
    Task(const Task&& obj);
    Task(string, list<Stimulation*>);
    Task& operator+=( Stimulation* obj);
    Stimulation* Task::operator[](int i) const;
};
#endif

我想成为啤酒来访问列表中的每个刺激。

我知道我应该使用矢量,但使用列表是必需的。

我将如何重载 []?

我试过了

    Stimulation* Task::operator[](int i) const
{
    list<Stimulation*>::const_iterator iter;
    iter = listOfStimulations.begin();
    advance(iter, i);
    return *iter;
}

我的主要问题是这段代码不允许我访问列表中的元素。

例如,listOfStimulations[i] 不起作用,并且不允许我访问 Stimulations 类中的函数显示。

【问题讨论】:

  • 只使用begin()end()?
  • 您可以使用迭代器遍历列表,直到到达第 n 个节点。
  • 如果是标准的list,则不能; operator[] 必须是非静态成员函数。 std::list 的要求表明这个练习想教你如何在不依赖索引的情况下进行编程。
  • @molbdnilo 抱歉,练习确实指定了重载 [] 运算符。
  • @felix 我试过paste.ee/p/j64wi 我不完全确定它是否符合我的要求。我希望能够做 listofStimulation[i]->display() 来调用对象的显示函数。

标签: c++ list pointers visual-c++


【解决方案1】:

顺序访问list 的最佳方法是使用它的Iterator

我建议使用符合要求的数据结构,而不是仅仅因为尝试使用列表。

这就是迭代器的工作方式;

for (std::list<T>::iterator it = mylist.begin(); it != mylist.end(); ++it)
{
   if (...)
   {
      return *it;
   }
}

现在您可以使用advance 获得“随机”访问权限;

std::list<T>::iterator it = mylist.begin();
std::advance(it,5);
return *it

【讨论】:

  • 确实,请参阅paste.ee/p/j64wi 问题是这会使我的列表的 [] 过载吗?或者只是我的实际对象。
  • 好的,我已经更新了我的代码(见主帖)。我仍然无法访问每个刺激的显示功能。
  • 尝试使用 std::advance(it,5); std::advance(it,5) 的结果;与 mylist[5] 的结果相同
  • 你说得对,但它仍然不允许我访问列表中对象的成员。 (例如,列表中的每个对象都有显示功能)。我需要调用它
  • 无条件 returnfor 循环中?
【解决方案2】:

你没有指定是否需要随机访问列表中的每个元素,给定它的索引/位置。

无论如何,正如 molbdnilo 所评论的,std::list 没有 operator[], 原因说明请阅读this other question on StackOverflow

访问列表中的项目的最佳方法是使用迭代器,从 std::list::begin() 开始。

已编辑
好的,根据您自己的评论,您需要随机访问每个索引项。 您在该评论中链接的代码看起来不错。

【讨论】:

  • 嗨,基本上我希望获取我的列表并访问方括号内的每个元素。我知道原因,我应该使用向量。不幸的是,这是一个要求。我已经尝试过了,paste.ee/p/j64wi,但它并没有做我想做的事。 listofStimulations[i]->display()
  • 唯一的问题是我似乎无法使用列表来访问其中的每个对象指针,这让我相信我的声明做错了。
  • 没有完整但基本的源代码,很难尝试了解您真正在做什么以及需要什么来帮助您。我建议您编辑您的问题并为其添加最少的源代码(内联,而不是 StackOverflow 之外的链接页面)。在您链接的代码中,您正在重载一个名为 Task 的类的 operator[] (不是,它没有在您的代码片段中的任何地方定义。
猜你喜欢
  • 2020-10-14
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多