Конструкторы перегрузки для структуры классов с более чем одним экземпляром структуры этого класса - PullRequest
2 голосов
/ 09 ноября 2011

Привет всем, кто читает

Я сам изучаю C ++ из учебника.

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

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

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

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

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

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

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

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

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

** Обратите внимание, что я ответил (я думаю!) на упражнение / вопрос 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

int classroom :: next_student_id = 1;

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

student_id = next_student_id ++;

** cout << "\ nstudent id:" <</blockquote>

Большое спасибо взаранее

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

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

int main()
{       
  classroom studentA(100);
  classroom studentB();
  classroom studentC(200);
  classroom studentD();
  classroom students[100];
  //and so on...
}
1 голос
/ 09 ноября 2011

Вопросы 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 (стандартной библиотеки), и это в основном массив динамического размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...