【问题标题】:C++ Program does not enter into for loopC++程序不进入for循环
【发布时间】:2016-02-23 15:17:50
【问题描述】:

我是 C++ 新手,我正在尝试执行以下操作:

1) 我创建了一个名为 Objects 的对象类,其中包含对象的名称和用于识别它们的数字。

2)我创建了一个继承自list的类Group,如下:

#include "objects.h"
#include <list>
#include <iostream>
#include <string> using namespace std;

class Group : public std::list<Objects*> { private:
    string groupname;

public:
    Group(string groupname);
    virtual ~Group() {} //destructor

    virtual string getGroupName() const;
    virtual void showlist(ostream & sl) const; };

3)然后,我实现了方法showlist如下:

void Groupe::showlist(ostream & sl) const{
        printf("I'm here 1\n");

        for(auto it = this->begin(); it != this->end(); it++){
             printf("I'm here 2\n");

             sl << this->getGroupName() << "test" << "test\n" << endl;
             std::cout << "I'm alive";
    } }

而getGroupName方法如下:

string Group::getGroupName() const{
    return groupname;
}    

4) 在主程序中,我创建了一个指向 Group 类型变量的指针。代码编译没有任何错误,但是当我执行它时,我意识到程序进入了方法 showlist 并在没有执行 for 循环的情况下退出。我已经通过使用 printf 发送消息对此进行了测试。终端中仅显示消息“方法之前”、“我在这里 1”和“方法之后”。它没有显示“我在这里 2”。我从 main 调用如下:

Group *lgroup = new Group[5] {Group("g1"), Group("g2"),Group("g3"),Group("g4"),Group("g5")};

    printf("Before method\n");
    lgroup->showlist(sl);
    printf("After method\n");
    cout << sl.str() << endl;

您能帮我理解为什么没有执行循环吗?


更新

程序没有进入循环,因为列表是空的,正如成员的回答中所解释的那样。

至于这个case继承自List是一个约束,我在main函数中填写了如下列表:

Groupe *lgroup1 = new Groupe("g1");
Object *objets[3];

objets[1] = new File("/home/Documents", "b2.jpg",0,0);
objets[2] = new File("/home/Documents", "b3.jpg",0,0);
objets[3] = new File("/home/Documents", "b4.jpg",0,0);

lgroup1->push_back(objets[1]);
lgroup1->push_back(objets[2]);
lgroup1->push_back(objets[3]);

其中File 是一个继承自类Objects 的类。这样程序编译并执行。在命令行中显示了类Groupe 的属性,即g1。我想使用 display 类中已经实现的方法 Objects 但是当我尝试这样做时,编译器会显示此错误:

 error: 'const class Group' has no member named 'display'
              sl << this->display(cout) << '\n' << endl;

那么,我的问题是如何让Group 类继承List(已经完成)和Objects 的方法?

【问题讨论】:

  • 在你的代码中设置一个断点并单步执行它,看看它是否真的在跳过循环或者可能发生什么。
  • 您不想从标准容器继承。使用聚合而不是继承。
  • 要在更新后回答您的问题,请查看multiple inheritance

标签: c++ list for-loop


【解决方案1】:

因为您没有在列表中添加任何内容。您正在一个数组中创建五个空的、不相关的列表,然后逐步遍历(空)第一组。

【讨论】:

  • 无需添加其他答案。
【解决方案2】:

暂时不考虑您不应该从标准库容器派生(参见Is there any real risk to deriving from the C++ STL containers?)...

线

Group *lgroup = new Group[5] {Group("g1"), Group("g2"),Group("g3"),Group("g4"),Group("g5")};

为 5 个 Group 对象分配内存并将该内存分配给lgroup。但是,lgroup 仍然没有作为列表包含在其中的项目。因此,lgroup-&gt;begin() 等于 lgroup-&gt;end()

如果您希望其他Groups 包含在lgroup 中,您需要使用:

Group *lgroup = new Group;
lgroup->push_back(new Group("g1"));
lgroup->push_back(new Group("g2"));
lgroup->push_back(new Group("g3"));
lgroup->push_back(new Group("g4"));
lgroup->push_back(new Group("g4"));

为此,您需要将Group 设为Object 的子类型。最好将您的班级更改为:

class Group : public Object
{
   private:
      string groupname;

   public:
      Group(string groupname);
      virtual ~Group() {}

      std::list<Objects*>& getObjects();
      std::list<Objects*> const& getObjects() const;

      virtual string getGroupName() const;
      virtual void showlist(ostream & sl) const; 
      std::list<Objects*> objects_;
};

然后使用

Group *lgroup = new Group;
lgroup->getObjects().push_back(new Group("g1"));
lgroup->getObjects().push_back(new Group("g2"));
lgroup->getObjects().push_back(new Group("g3"));
lgroup->getObjects().push_back(new Group("g4"));
lgroup->getObjects().push_back(new Group("g4"));

【讨论】:

  • 嗨 R Sahu,为什么从标准库容器派生不是一个好习惯?我已经尝试过你的建议,但现在我有编译错误。我有以下内容: main.cpp:73: error: no matching function for call to 'Group::push_back(Group*)' lgroup->push_back(new Group("g2")); ^
  • @MarcoSurca,没错。 Group 派生自 Object。因此,Group* 不能转换为 Object*
  • 谢谢,我明白为什么从STL继承不好了。然而,对于这种情况,从 List 继承是一个约束。如问题更新所示,我已填写“列表”。但我想知道是否可以从“列表”和“对象”继承方法。当我调用已经在“对象”中实现的方法时,程序无法编译。
  • @MarcoSurca,是的,可以从多个对象派生。试一试。
【解决方案3】:

对于第一个问题,程序没有进入循环,因为列表是空的,正如成员的回答所解释的那样。

对于第二个问题,没有必要使用多重继承来继承类Object的方法。对于这种情况,display 是我要使用的方法。需要用指针调用它:

    for(list<Object*>::const_iterator it = this->begin(); it != this->end(); it++){
        sl << this->getGroupName() << ' ' ;
             (*it)->display(sl);

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2021-12-12
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多