2016-02-23 124 views
2

我新的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的方法?

+4

在代碼中放置一個斷點並逐步遍歷它,看它是否真的跳過循環或者可能發生什麼。 – Jacobr365

+8

你不想從標準容器繼承。使用聚合而不是繼承。 – crashmstr

+0

要在更新後回答您的問題,請選中[多重繼承] – Nacho

回答

3

忽視了,你不應該從標準庫中的容器中獲得的那一刻(見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個對象和內存分配給lgroup 。但是,lgroup仍然沒有包含在其中的項目列表。因此,lgroup->begin()等於lgroup->end()

如果你想在其他Group s到包含在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")); 
+0

Hi R Sahu,爲什麼從標準庫容器中派生出來不是一個好習慣?我已經嘗試過您的建議,但現在我已編譯錯誤。我有以下幾點:main.cpp:73:error:沒有匹配函數調用'Group :: push_back(Group *)' lgroup-> push_back(new Group(「g2」)); ^ – Marco

+0

@MarcoSurca,沒錯。 「組」來自「對象」。因此,一個'Group *'不能轉換爲'Object *'。 –

+0

@MarcoSurca,請參閱更新回答 –

6

因爲您沒有將任何東西放入列表中。您正在數組中創建五個空的不相關列表,然後逐步遍歷(空)第一組。

+0

不需要添加其他答案。 –

0

對於第一個問題,程序沒有進入到循環,因爲該列表是空的,在解釋成員的答案。

對於第二個問題,沒有必要使用多重繼承繼承類Object中的方法。對於這種情況,display是我想要使用的方法。有必要用一個指針來調用它:

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