Претоварване на конструктори за класова структура с повече от един екземпляр на тази класова структура

Здравейте на всички, които четат

Самообучавам C++ от учебник.

...и ми бяха зададени сериозен брой въпроси, които имам проблеми с тълкуването, въпросите са:

4. Променете конструктора на Упражнение 3, така че да присвоява нов идентификационен номер при установяването на всяка променлива. ID номерът трябва да бъде изведен на екрана.

**Моля, обърнете внимание: Упражнение 3 просто добавяше конструктор на клас към структурата на класа - и основно задаваше всички частни променливи на класа на '0' в този добавен конструктор.

5. Добавете конструктори към класа на упражнение 4. Те трябва да извеждат ID номера, когато бъдат извикани.

6. Напишете конструктор, чийто аргумент е ID номер. Претоварете го с конструктора на (упражнение 5) и след това напишете основна програма, за да тествате този нов конструктор.

**Така че въпросите: 4 и 5 ме объркват, тъй като изглежда, че задават едни и същи въпроси (т.е. извеждат ID числата) и имам нужда от повече от един „конструктор“, за да направя това (получавам тази част).

**Въпрос 6 на практика ме моли да претоваря повече от едно декларирано копие на класа с идентификационен номер като аргумент!!!! Объркан съм, защото в моя учебник изрично се посочва, че не можете да имате аргумент за конструктор, когато имате масив от класове, декларирани в основната програма.

Така че, ако някой може да хвърли светлина върху тези въпроси и да изясни как ще продължат, ще оценя помощта. Оценявам, че може да съм изтълкувал въпросите погрешно, затова моля за помощ.

**Моля, обърнете внимание: Името на класа: „класна класна стая“ не е идеално, но е това, което копирах от въпроса за учебника!

**Моля, имайте предвид също, че отговорих (мисля!) на упражнение/въпрос 4, като добавих код, който е Id на всеки екземпляр на променливата на класа.

И съответният код, свързан с горните въпроси, е:

#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;

и в конструктора добавих този код: който основно изведе на екрана уникален идентификатор за всеки екземпляр на променлива клас клас:

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