【问题标题】:C++ list not recognized as a container?C++ 列表不被识别为容器?
【发布时间】:2016-10-29 23:05:04
【问题描述】:

这是一个更具体的问题,是关于我在这项任务中似乎遇到的问题。基本上,说明是使用 STL(而不是链表)创建一个列表。在示例中,我看到如下内容:

#include <vector>
#include <iterator>

vector<char> container = { 'A','B','C','D','E' };

    cout << "Print vector using an iterator: ";
    vector<char>::iterator iter = container.begin();    
    while (iter != container.end())
    {
        cout << *iter << " ";
        ++iter;
    }
    cout << endl;                   // OUTPUT: A B C D E        

虽然我尝试在我的作业的 Main.cpp 文件中做:

#include "AnyList.h"

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main()
{
    AnyList list1, list2;

    list1.insertFront(10);
    list1.insertFront(11);
    list1.insertFront(12);
    list1.insertFront(13);
    list1.insertFront(14);

    list<int>::const_iterator iter = list1.begin();

AnyList.h

#ifndef ANYLIST_H
#define ANYLIST_H

#include<iostream>
#include <string>   
#include <list>

#include <vector>
#include <iterator>

class AnyList
{
public:

    AnyList();

    int getNumOfElem() const;

    void insertFront(int data);
    void forwardPrint();

private:
    list<int> *ptr; 
};

#endif

AnyList.cpp

#include "AnyList.h"
#include <vector>
#include <iterator>

AnyList::AnyList() 
{

}

int AnyList::getNumOfElem() const
{
    return static_cast<int>(ptr->size());
}

void AnyList::insertFront(int data)
{
    ptr->push_front(data);
}

void AnyList::forwardPrint()
{
    list<int>::const_iterator i;
    for (i = ptr->begin(); i != ptr->end(); ++i)
    {
        cout << *i << " ";
        cout << endl;
    }
}

在主文件中,换行:

list::const_iterator iter = list1.begin();

我收到一条错误消息,提示“begin”不是 AnyList 的成员。我查了一下问题可能是什么,它似乎是由于 list1 不是实际容器引起的?从外观上看,它应该是 insertFront 创建的列表的容器,但它无法识别它。

列表的实现方式是否存在错误?还是 insertFront 没有正确完成?实际上,我尝试使用该行运行程序的全部原因是查看 insertFront 是否正常工作,但现在我不知道错误在哪里。我见过的大多数示例都是在一个文件中声明的,而不必在类中实现它,因此此时此分配非常混乱。

还要澄清一些潜在的误解: - AnyList 类、私有成员变量和 getNumOfElem 函数已包含在文件中,并提供 getNumOfElem 作为实际实现示例。

编辑:我也需要一些关于如何在此处正确初始化变量“ptr”的帮助,因为据说这也可能是阻止大部分工作的问题。

【问题讨论】:

  • 问题是 AnyList 实际上没有提供 begin 方法。我的意思是,你有声明:它支持getNumOfEleminsertFrontforwardPrint。就是这样。
  • 也许尝试自己做这个作业?你似乎想把它写给你,一次一个愚蠢的错误。
  • 我正在尝试这样做,这就是它的开始。我的意思是,如果我知道如何解决出现的问题,这些问题就没有必要了。
  • 学习一些基本的 C++ 并自己弄清楚。 SO 不适合这类问题。
  • 如果你不想再帮助我的问题也没关系。这里有很多人愿意提供帮助,所以你在浪费时间在这里治安。

标签: c++ list iterator


【解决方案1】:
AnyList list1, list2;

list<int>::const_iterator iter = list1.begin();

此代码调用list1 对象的begin() 方法。 list1AnyList 类的一个实例。

为此,AnyList 类必须实现一个名为begin() 的类方法,该方法返回一个list&lt;int&gt;::const_iterator

问题中显示的AnyList 类的声明表明该类没有实现任何称为begin() 的方法。 AnyList 类只实现了三个类方法,分别命名为getNumOfElem()insertFront()forwardPrint()

容器不是 C++ 中的某种自动魔法概念,它自动适用于任何类。容器只是它自己的一个普通类(模板类,但在这里不相关),具有普通方法。

如果AnyList 类应该表现得像一个容器,并且可以与其他可用于容器的 C++ 库算法和模板一起工作,那么AnyList 类必须满足 C++ 容器的所有要求,包括定义其拥有begin()end()方法等方法,以及定义一些内部类型。

【讨论】:

  • 我明白了,感谢您的意见!为什么它需要在该类中定义而不是在该类之外(如示例中)?
  • 什么例子?这里没有定义 begin()/end() 等的示例。 “课外”。
  • 在我帖子的第一个代码块中(带有向量)。我看到的所有示例文件(或在线示例)都没有定义 begin()。
  • 显示的第一段代码没有定义任何东西。言语意味着事情。 “定义”并不意味着“使用”。第一个代码块使用begin() 方法,它没有定义它。 std::vector#include &lt;vector&gt; 标头中定义。该标头定义了一个名为vector 的模板类,具有begin()end() 方法,以及许多其他方法。这就是为什么您可以使用名为begin()std::vector 方法。
  • 即使你解决了这些问题,代码仍然无法工作,因为AnyList 将其内部列表声明为一个永远不会指向任何有效内容的指针。构造函数需要一个ptr = new list&lt;int&gt;; 语句(您还需要一个复制构造函数、复制赋值运算符和析构函数。参见Rule of Three)。否则,将声明改为list&lt;int&gt; ptr;,并相应地将ptr-&gt; 的所有使用调整为ptr.。或者,直接去掉AnyList,在需要的地方直接使用std::list
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多