Конструкторы перегрузки для структуры класса с более чем одним экземпляром этой структуры класса

Привет всем прочитавшим

Я самостоятельно изучаю С++ по учебнику.

... и мне задали ряд вопросов, которые я не могу интерпретировать, вот вопросы:

<сильный>4. Измените конструктор в упражнении 3, чтобы он присваивал новый идентификационный номер при установлении каждой переменной. Идентификационный номер должен быть выведен на экран.

**Обратите внимание: в упражнении 3 конструктор класса просто добавлялся в структуру класса и в основном устанавливался для всех частных переменных-членов класса в «0» в этом добавленном конструкторе.

<сильный>5. Добавьте конструкторы в класс упражнения 4. Они должны выводить идентификационный номер при вызове.

<сильный>6. Напишите конструктор, аргументом которого является идентификационный номер. Перегрузите его конструктором (упражнение 5), а затем напишите основную программу для тестирования этого нового конструктора.

** Итак, вопросы: 4 и 5 сбивают меня с толку, поскольку они, кажется, задают одни и те же вопросы (т.е. выводят идентификационные номера), и мне нужно более одного «конструктора», чтобы сделать это (я получаю эту часть).

**Вопрос 6 фактически просит меня перегрузить более одного экземпляра, объявленного в классе, с идентификационным номером в качестве аргумента!!!! Я запутался, потому что в моем учебнике конкретно указано, что у вас не может быть аргумента для конструктора, когда у вас есть массив классов, объявленных в основной программе.

Поэтому, если кто-нибудь может пролить свет на эти вопросы и уточнить, как они будут действовать, я был бы признателен за помощь. Я понимаю, что я мог неправильно интерпретировать вопросы, поэтому я прошу о помощи.

** Обратите внимание: название класса: «классный класс» не идеальное, но это то, что я скопировал из вопроса учебника!

** Также обратите внимание, что я ответил (я думаю!) на упражнение/вопрос 4, добавив код, который идентифицирует каждый экземпляр переменной класса.

И соответствующий код, относящийся к вышеуказанным вопросам:

#include <iostream>
#include <cstdio>

using namespace std;


  class classroom{

         char name[25];
         int student_id;
         float grades[10];
         float average;
         int num_tests;
         float letter_grade;
         **static int next_student_id;**
  public:       
         void enter_name_id(void);
         void enter_grade(void);
         void average_grades(void);
         void letter_grades(void);
         void output_name_id_grade(void);
         classroom();

  };

         **int classroom::next_student_id=1;**

и конструктор:

classroom::classroom(){

          int i;

          num_tests=0;

         **student_id=next_student_id++;**           

         **cout<<"\nstudent id: "<<student_id;**

          average=0.0;
          for(i=0;i<10;i++){

            grades[i]=0.0;

          }

          for(i=0;i<27;i++){

             name[i]='-';       
          }
          cout<<"\n*****************Finished*****************";
     }

И основное объявление программы:

int main()
{       
      classroom students[3];
//and so on...
}

и код, добавленный для вопроса/упражнения 4, был таким:

в структуру класса я добавил следующую закрытую переменную-член:

**static int next_student_id;**

и вне структуры класса я инициализировал статическую переменную до 1

в классе::next_student_id=1;

и в конструкторе я добавил этот код: который в основном выводил на экран уникальный идентификатор для каждого экземпляра переменной класса класса:

student_id=next_student_id++;

** cout<<"\nstudent id: "<

Many thanks in advance


person Mr_leighman    schedule 09.11.2011    source источник


Ответы (2)


Вопросы 4 и 5, похоже, совпадают с тем, что вы предоставили - я бы внимательно перечитал их, чтобы быть уверенным, но это будет не первый раз, когда в примерах учебника есть опечатка (на самом деле, я сталкивался с это много раз - многие книжные компании ленивы, когда дело доходит до упражнений).

У вас есть правильный ответ с вашим статическим счетчиком, поэтому я бы не беспокоился об этом - вы поняли цель и решили проблему.

Вопрос 6... похоже, он хочет, чтобы вы просто добавили дополнительный конструктор в класс - так что у вас будет конструктор по умолчанию (который вы должны явно написать, но вы уже сделали это, чтобы сделать свой статический счетчик) , и у вас также будет конструктор с одним параметром, принимающий целое число. Конструктор с одним параметром не должен использовать статическую переменную, поскольку он позволяет пользователю явно указать идентификатор класса.

Двигаясь дальше (поскольку я думаю, что у вас уже все это есть), вы также правы, думая, что вы не можете предоставить аргумент конструктору при создании массива. Чтобы протестировать № 6, как он предлагает, вам нужно либо создать автономный объект (то есть не массив), либо что-то вроде std::vector или другого контейнера, который предоставляет эту возможность.

#include <iostream>
#include <vector>

class A {
    public:
        A(int i) { /* Empty */ }
}; 

int main()
{
    //Creates a new vector holding 5 A's initialized with the 2nd parameter.
    std::vector<A> myVec(5, A(7));
}

Обратите внимание, что это технически создает временный A, который используется для инициализации 5 векторных записей. Также обратите внимание, что std::vector является частью STL (стандартной библиотеки) и представляет собой массив с динамическим размером.

person John Humphreys    schedule 09.11.2011
comment
Так же можно поставить полезную галочку за помощь - person Mr_leighman; 10.11.2011

Где пункт 6 требует наличия массива объектов класса?

int main()
{       
  classroom studentA(100);
  classroom studentB();
  classroom studentC(200);
  classroom studentD();
  classroom students[100];
  //and so on...
}
person neagoegab    schedule 09.11.2011
comment
Да, спасибо, neagoegab, я вижу, что ваш ответ будет способом продолжить и ответить на мой вопрос 6. Я проведу расследование и вернусь, тем временем вы также можете получить от меня «полезную галочку» за помощь. - person Mr_leighman; 10.11.2011