2017-04-24 45 views
1

我試圖通過id屬性實現2類之間的關係。 teamIdSoccerTeams類中必須與managing_directors類中的董事的directorId相同,以便指定總經理給足球隊。遍歷矢量中的對象的數據成員

這兩個類別分別具有矢量teamsman_dirs

class SoccerTeams { 
    string teamName; 
    int teamId; 
    friend class managing_directors; 
public: 

    //teams vector 
    vector<SoccerTeams> teams; 

    void addTeam(string name, int id) { 
     SoccerTeams newTeam(name, id); 
     teams.push_back(newTeam); 
    }; 

    SoccerTeams(){}; 
    SoccerTeams(string teamName, int id){ 
     teamName = teamName; 
     teamId = id; 
    }; 
    ~SoccerTeams(){}; 
}; 


//managing directors of a soccer team 
class managing_directors : public SoccerTeams, public people { 
    int directorId; 
public: 
    //man_dirs vector 
    vector<managing_directors> man_dirs; 

    managing_directors(int num_of_managers, int avg_age); 
    managing_directors(){}; 
    ~managing_directors(){}; 
    void addDirector(string name, char sex, int age, int id) { 
     managing_directors newDirector; 
     newDirector.name = name; 
     newDirector.sex = sex; 
     newDirector.age = age; 
     newDirector.directorId = id;       
     man_dirs.push_back(newDirector); 
    }; 

我試着做一個函數來檢查如下的manage_directors類中的團隊ID。

int idChecker(int id) { 
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) { 
     if(i -> teamId == id) 
      return 1; 
    } 
    return 0; 
} 

但功能總是返回0,我相信這是因爲它沒有檢查在主函數創建團隊矢量相同的情況下,因爲當我試圖打印內部managing_directors類此teams載體,它是空的。是否有可能使teams載體成爲全球性的? 這是解決這個問題的正確方法嗎?人類的

定義在managing_directors繼承(以防萬一)

class people { 
    string name; 
    char sex; 
    int age; 
    bool under_auth; 
    int auth_level; 
    friend class managing_directors; 
public: 
    people(){}; 
    ~people(){};  
    virtual int get_age(){ return this->age; }; 
}; 

UPDATE:

我固定循環作爲一個答案給定的,但我不認爲是問題,因爲函數仍然返回0.我嘗試使用cout來嘗試打印所有的id,並且在輸出中沒有任何內容,它是空的。

我做了這樣的事情

int idChecker(int id) { 
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) { 
     cout << i - > teamId << endl; //test code 
     if(i -> teamId == id) 
      return 1; 
    } 
    return 0; 
} 
+0

使用'.cbegin()'和'.cend()'爲'const_iterators'。(C++ 11) – nitronoid

+1

董事總經理爲什麼從足球隊繼承? – Mike

+1

在您的更新中:可能是您沒有正確填充矢量的標誌,因爲給出您之前提供的信息,建議是正確的。你需要顯示那個代碼。但更普遍的是,提供一個[mcve]並在你的問題中具體。不要反覆出現一些信息,讓人們爲你解決一個又一個的問題。 – Peter

回答

4

你的循環是錯誤的。在

for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) { 
    if(i -> teamId == id) 
     return 1; 
    return 0; 
} 

如果第一i不匹配,那麼你立刻返回0,你需要做的是移動的是return 0;出來的for循環,所以你只返回0時,循環就不會找到匹配。這就給了你

int idChecker(int id) { 
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) { 
     if(i -> teamId == id) 
      return 1; 
    } 
    return 0; 
} 

你也可以簡化這個範圍使用基於for循環像

int idChecker(int id) { 
    for (const auto& e : teams) 
     if(e.teamId == id) 
      return 1; 
    return 0; 
} 

您也可以使用std::any_oflambda

int idChecker(int id) { 
    return std::any_of(teams.begin(), teams.end() 
     [=](const auto& e) { return e.teamId == id; }); 
}