2013-11-18 3 views
-1

У меня есть структураStruct внутри структуры

struct Course{ 
    int cId; 
    string courseName; 
}; 

, и я хочу, чтобы добавить студентов для каждого курса. Я думал определить другую структуру в структуре. Например, как

struct Course{ 
     int cId; 
     string courseName; 
     struct Student{ 
     int sId; 
     string studentName; 
     }; 
    }; 

Если я определяю структуру как это, как я могу ее использовать? У меня есть Course * cptr = new Course[1]; , который для использования курса структуры. Как я могу добавить учеников в указанные cId?

+0

Вложенные структуры? Зачем??? Есть ли веские основания для этого? –

+0

Добавить участника для 'struct', который вы указали внутри другого. –

+3

Вы должны были учиться в классе, когда преподавали массивы –

ответ

0
struct Course 
{ 
    // ... 
    struct Student 
    { 
     int sId; 
     string studentName; 
    }; 
}; 

Это определяет структуру Course и другую структуру Course::Student, но Course не создает экземпляр какого-либо учащегося (нет члена Course, который имеет тип Student). Если вы хотите, чтобы студенты быть членом, конечно, вам нужно что-то вроде этого:

struct Course 
{ 
    // ... 
    struct Student 
    { 
     int sId; 
     string studentName; 
    } student; 
}; 

или

struct Course 
{ 
    // ... 
    struct Student 
    { 
     int sId; 
     string studentName; 
    } students[10]; 
}; 

Какой бы определить один студент или массив из 10 студентов в качестве членов Course, соответственно , (Примечание: std::vector будет лучшим выбором, чем статически размера массива)

В качестве альтернативы, вы можете объявить Student как структура вне из Course:

struct Student { ... }; 

struct Course 
{ 
    // ... 
    Student student; 
    // or std::vector<Student> students; 
    // or std::array<Student, 10> students; 
    // or Student* students 
}; 
+0

, но количество студентов могло бы изменить выполнение, поэтому я должен распределять память динамически. Как я мог это сделать? вместо использования ученика [10]? – mxyz

+0

@mxyz. Вы использовали бы указатель и выделили его с помощью 'new []' (и освобождения от использования с помощью 'delete []'). Если это ваше требование, последний '// или' в моем последнем примере был бы методом, который вам нужно использовать, - если вам не разрешено использовать 'std :: vector'. –

+0

Например, у меня есть cptr [1] .cId (он уникален) для определенного курса, если я хочу добавить учеников к этому курсу, как я могу использовать стипендии? – mxyz

5

Ваш Course не содержит Student. Он просто определяет структуру этого имени, то есть тип Course::Student. Для типа, чтобы содержать экземпляр другого типа, вы просто должны объявить переменную-член:

struct Student { .... }; 

struct Course 
{ 
    .... 
    Student student; 
}; 

Если вы хотите, чтобы каждый курс держать более одного Student, то вы можете использовать контейнер. При отсутствии дополнительной информации, лучшим кандидатом для этого является std::vector:

struct Course 
{ 
    .... 
    std::vector<Student> students; 
}; 
0

std::vector является вашим другом, но если вы не можете использовать это, вы можете сделать:

struct Student {...}; // Implementation omitted for brevity... 

struct Course 
{ 
    Student *students_; // Use students_=new Student[num_students]; to allocate 
         // memory dynamically 
}; 
+0

спасибо, но не разрешено использовать векторы – mxyz

+0

@mxyz, обновлено, чтобы использовать указатель вместо –

0

Самый простой способ:

struct Student 
{ 
    int sId; 
    string studentName; 
}; 

struct Course 
{ 
    int cId; 
    string courseName; 
    std::vector <Student> students; 
}; 

Таким образом, вы можете написать

Student s; 
Course c; 
c.students.push_back(s); 
0

Я предпочитаю, чтобы вы разделили эту структуру на две отдельные структуры. Затем вы можете инициализировать объект-ученик в структуре курса. Или вы можете реализовать функцию в структуре курса, чтобы связываться со структурой Student.

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