2016-03-04 2 views
0

Я создал 3 класса.Векторный объект хранения

  • Все класс - хранение всех групп
  • Group класса - Сохранение объектов студентов в вектор.
  • Студенческий класс - хранение информации о студенте.

У меня есть проблемы со всем классом - метод printAllofThem он должен перебирать OBJETS группы и вызов метода в PRINTALL, который должен перебирать, хотя все объекты универсиады и называют printAtributes, но результат выглядит следующим образом:

all . printAllofThem (); 

выход:

------------------- 
------------------- 

------------------- 

Ожидаемый результат:

------------------- 
name: Mark | age: 20 | A1 

name: Alan | age: 20 | A1 

name: Eric | age: 19 | A1 

------------------- 
name: John | age: 19 | B1 

Это дает мне право выход только тогда, когда я называю его, как это в главной функции:

A1 . printAll (); 
B1 . printAll (); 

Код:

#include <string> 
#include <iostream> 
#include <vector> 

using namespace std; 

class Student 
{ 
    public: 
    Student (string name, int age, string cllass); 
    void printAtributes (void) const; 

    protected: 
    string     nameOfStudent; 
    string     whichClass; 
    int      ageOfStudent; 
}; 
//======================================================================== 
class Group 
{ 
    public: 
    Group (void); 
    bool addStudent (const Student & X); 
    void printAll(void) const; 

    protected: 
    vector<Student> vectorOfStudents; 
}; 
//======================================================================== 
class All 
{ 
    public: 
    All (void); 
    bool addToAll (const Group & T); 
    void printAllofThem (void) const; 

    protected: 
    vector<Group> vectorOfAll; 
}; 
//======================================================================== 
All::All (void) 
{ 
} 
//------------------------------------------------------------------------ 
bool All::addToAll (const Group & T) 
{ 
    vectorOfAll . push_back (T); 
    return true; 
} 
//------------------------------------------------------------------------ 
void All::printAllofThem (void) const // Function which iterate thought group objects 
{ 
    cout << "-------------------" << endl; 
    for (const auto & allofthem : vectorOfAll) 
    { 
    allofthem . printAll (); 
    cout << endl; 
    } 
} 
//------------------------------------------------------------------------ 
Student::Student (string name, int age, string cllass) 
      :nameOfStudent(name), ageOfStudent(age), whichClass(cllass) 
{ 
} 
//-------------------------------------------------------------------- 
void Student::printAtributes (void) const 
{ 
    cout << "name: " << nameOfStudent << " | " << "age: " << ageOfStudent << " | " << whichClass << endl; 
} 
//============================================================================ 
Group::Group (void) 
{ 
} 
//---------------------------------------------------------------------------- 
bool Group::addStudent (const Student & X) 
{ 
    vectorOfStudents . push_back (X); 
    return true; 
} 
//---------------------------------------------------------------------------- 
void Group::printAll (void) const 
{ 
    cout << "-------------------" << endl; 
    for (const auto & student : vectorOfStudents) 
    { 
    student . printAtributes (); 
    cout << endl; 
    } 
} 
//---------------------------------------------------------------------------- 
int main() 
{ 

    All   all; // Representing all classes 
    Group   A1; 
    Group   B1; 

    all . addToAll (A1); 
    all . addToAll (B1); 

    A1 . addStudent (Student ("Mark", 20, "A1")); 
    A1 . addStudent (Student ("Alan", 20, "A1")); 
    A1 . addStudent (Student ("Eric", 19, "A1")); 

    B1 . addStudent (Student ("John", 19, "B1")); 

    A1 . printAll (); 
    B1 . printAll (); 

    all . printAllofThem (); 

    return 0;  

} 
+1

Это звучит, как вы, возможно, потребуется, чтобы узнать, как использовать отладчик для пошагового ваш код. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Вы вызываете, например. 'all.addToAll (A1)' * перед * модификацией его с помощью 'A1.addStudent (...)'. Эти изменения не будут автоматически распространяться на копию 'A1', которая ранее была добавлена ​​в ваш объект' all'. – nrussell

+0

'addToAll' does' vector.push_back', который, в свою очередь, делает копию того, что вы нажимаете.Поскольку вы вызываете 'addToAll' с пустыми группами, объект' All' пуст. Попробуйте сделать 'addToAll' после того, как' addStudent ' – Nacho

ответ

1

Когда вы добавили A1 и B1 к all, обе эти группы были все еще пуст - и вы взяли их копии. Когда вы впоследствии добавили учеников в A1 и B1, эти группы получили новых учеников, но группы в all - это совершенно разные группы - они остаются неизмененными.

Либо

  • Добавить студентов в группы первых, затем добавить группы к all.
  • Укажите, что группа shared_ptr<Group>, с All имеет номер vector<shared_ptr<Group>>. Таким образом, упорядочение не имеет значения, так как есть только два объекта группы, которые все просто разделяют.

Побочное примечание. Это действительно чрезмерное количество пространств:

B1 . printAll (); 

Вам не нужно ... ни один из них:

B1.printAll(); 
+0

Да, это была проблема, спасибо вам большое. – kvway

+0

Об этих пространствах он выглядит более табличным для меня, и это вызывает проблемы? – kvway

+0

@ kvway Глядя на табличку, это странная цель для кода. Но нет, пробелы не имеют значения в C++. – Barry

Смежные вопросы