繁体   English   中英

C ++程序不进入for循环

[英]C++ Program does not enter into for loop

我是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;

你能帮我理解循环没有被执行的原因吗?


更新

该程序没有进入循环,因为列表是空的,如成员的答案中所述。

至于从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 我想使用已在类Objects实现的方法display ,但是当我尝试这样做时,编译器会显示以下错误:

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

所以,我的问题是如何让类GroupList (已经完成)和Objects继承方法?

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

忽略您不应该从标准库容器派生的那一刻(请参阅从C ++ STL容器派生是否存在任何真正的风险? )...

这条线

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

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

如果您希望其他Group包含在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"));

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM