我新的C++,我試着做以下幾點:C++程序不進入for循環
1)我創建了一個類的對象稱爲對象包含的對象和名稱號碼來識別它們。
2)I已經創建了一個類組,其從列表中繼承,如下所示:
#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)在主程序中,我創建了一個指向變量t ype集團。代碼編譯沒有任何錯誤,但是當我執行它時,我意識到程序進入方法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
繼承是一種約束,我在主函數填充列表如下:
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
的方法?
在代碼中放置一個斷點並逐步遍歷它,看它是否真的跳過循環或者可能發生什麼。 – Jacobr365
你不想從標準容器繼承。使用聚合而不是繼承。 – crashmstr
要在更新後回答您的問題,請選中[多重繼承] – Nacho