簡體   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