2017-10-04 7 views
1

Remarque - I ont ont beaucoup cherché sur les pointeurs et les références pour C++. Je ne semble pas les comprendre en CE scénario particulier. D'où le poster ici! Le code suivant est CORRECT Ça fonctionne. J'ai écrit cela pour un problème de pratique en ligne C++. Une partie du code m'a été donnée initialement.Quelle est la nécessité du pointeur dans ce morceau de code C++?

Je ne comprends pas pourquoi un tableau d'objets personne est créé dans la fonction principale avec un * par [n] comme indiqué ci-dessous:

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

class Person { 
     string name; 
     int age; 
    public: 
     Person(){ 
      name = ""; 
     } 
     virtual void putdata() = 0; 
     virtual void getdata() = 0; 
}; 


class Professor: public Person { 
     int publications, cur_id; 
     string name; 
     int age; 
    public: 
     static int professorCount; 

     Professor(){ 
      name = ""; 
      age = 0; 
      publications = 0; 
      cur_id = professorCount + 1; 

      professorCount++; 
     } 
     void getdata(){ 
      cin >> name >> age >> publications; 
     } 
     void putdata(){ 
      cout << name << " " << age << " " << publications << " " << cur_id << endl; 
     } 
}; 

class Student: public Person { 
     int marks[6]; 
     int cur_id; 
     string name; 
     int age; 
    public: 
     static int studentCount; 

     Student(){ 
      name = ""; 
      age = 0; 
      cur_id = studentCount + 1; 

      studentCount++; 
     } 
     void getdata(){ 
      cin >> name >> age >> marks[0] >> marks[1] >> marks[2] >> marks[3] >> marks[4] >> marks[5]; 
     } 
     void putdata(){ 
      cout << name << " " << age << " " << marks[0] + marks[1] + marks[2] + marks[3] + marks[4] + marks[5] << " " << cur_id << endl; 
     } 
}; 

int Professor::professorCount = 0; 
int Student::studentCount = 0; 

Dans cette fonction principale ci-dessous, un tableau des objets Personne est en cours de création, mais on lui donne un * au début. Comment ça marche?

int main(){ 

    int n, val; 
    cin>>n; //The number of objects that is going to be created. 
    Person *per[n]; // THIS ONE RIGHT HERE! THIS ONE! 

    for(int i = 0;i < n;i++){ 

     cin>>val; 
     if(val == 1){ 
      // If val is 1 current object is of type Professor 
      per[i] = new Professor; 

     } 
     else per[i] = new Student; // Else the current object is of type Student 

     per[i]->getdata(); // Get the data from the user. 

    } 

    for(int i=0;i<n;i++) 
     per[i]->putdata(); // Print the required output for each object. 

    return 0; 

} 
+1

Il est donc vous pouvez remplir le tableau des fuites plein ou mémoire. – juanchopanza

+0

@juanchopanza - pouvez-vous élaborer s'il vous plaît. Je vous remercie! –

+0

L'identificateur utilise des tableaux de longueur variable (VLA) qui ne sont pas pris en charge par * standard * C++, mais certains compilateurs sont ajoutés en tant qu'extension. Convertir en 'std :: vector' ou utiliser l'allocation de mémoire dynamique. –

Répondre

1

Vous créez un tableau de pointeurs objets personne. C'est ainsi que les affectations comme per[i] = new Professor; peuvent fonctionner - new Professor renvoie un pointeur vers un objet Professeur, vous avez donc besoin d'un tableau de pointeurs pour le stocker.

+2

Salut! Cela a totalement bouleversé mon esprit - je ne savais pas que le nouveau professeur a renvoyé un pointeur sur un objet Professeur! Merci beaucoup! –

+0

@NarayanDheerajKumar Je recommande fortement d'obtenir [un meilleur livre de texte] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) si votre matériel de lecture actuel vous a laissé surpris par cette . – user4581301

+0

@ user4581301 Je vais le faire. –

3

Je ne comprends pas pourquoi un tableau d'objets personne est créé dans la fonction principale avec un *per[n] comme indiqué ci-dessous

Le but de stocker un pointeur est de soutenir le polymorphisme virtuel (les classes abstraites comme Person ne peuvent pas être instanciées). Un pointeur intelligent sert aussi, mais prend soin de la bonne dynamic memory management.

Il n'est pas nécessaire d'utiliser des pointeurs bruts ou des tableaux bruts en C++. Ce code ne donne pas un bon exemple de "meilleures pratiques".

à la fonction main()

Person *per[n]; // Note that VLA's aren't standard c++ syntax 

doit être remplacé par

std::vector<std::unique_ptr<Person>> per(n); 

et la boucle en conséquence

for(int i = 0;i < n;i++){ 

    cin>>val; 
    if(val == 1){ 
     // If val is 1 current object is of type Professor 
     per[i] = std::make_unique<Professor>(); 
       // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    } 
    // Else the current object is of type Student 
    else per[i] = std::make_unique<Student>(); 
       // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

    per[i]->getdata(); // Get the data from the user. 

} 

également

int marks[6]; 

doit être remplacé par

std::array<int,6> marks; 

std::array est beaucoup plus pratique et moins sujette aux erreurs lorsqu'elle est transmise comme paramètre de fonction, etc.

+0

merci beaucoup. Je vais garder cela à l'esprit. –

+0

Bien que ce soit vrai, je ne pense pas que cela répond à la question clé de savoir pourquoi vous stockez des pointeurs sur les objets plutôt que sur les objets eux-mêmes. – templatetypedef

+1

@templatetypedef Je pense que mon camarade l'utilise. Paragraphe commençant par "Le but du stockage d'un pointeur est de prendre en charge le polymorphisme virtuel ..." – user4581301