[英]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;
所以,我的問題是如何讓類Group
從List
(已經完成)和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.