2017-10-04 7 views
1

- I は、C++のポインタと参照を多く検索しました。 これはわかりません。こののシナリオです。したがってここにそれを掲示する!このC++コードでポインタの必要性は何ですか?

以下は、CORRECTコードです。それは働いている。私はこれをオンラインC++の練習問題のために書いた。最初にコードの一部が私に与えられました。以下に示すように、Personオブジェクトの配列[n]が当たりメイン関数*で作成されている理由私は理解していない

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

以下、この主な機能は、アレイPersonオブジェクトは作成されていますが、先頭に*が付いています。どのように機能していますか?

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

など、発生しやすい方法で、より便利で、より少ない誤差です。 – juanchopanza

+0

@juanchopanza - 詳細を教えてください。ありがとうございました! –

+0

*標準* C++ではサポートされていない可変長配列(VLA)が使用されていますが、一部のコンパイラでは拡張機能として追加されています。 'std :: vector'に変換するか、動的メモリ割り当てを使います。 –

答えて

1

あなたはポインタPersonオブジェクトへの配列を作成しています。これはper[i] = new Professor;のような割り当てが機能する方法です。new Professorは教授オブジェクトへのポインタを返します。ポインタを格納するポインタの配列が必要です。

+2

こんにちは!これは私の心を完全に吹き飛ばしました - 私は新しい教授が教授オブジェクトへのポインタを返したことを知らなかった!どうもありがとうございます! –

+0

@NarayanDheerajKumarあなたの現在の読書資料がこのことに驚いた場合、[より良いテキストブック](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を入手することを強くお勧めします。 – user4581301

+0

@ user4581301私はそれをします。 –

3

Personオブジェクトのアレイは*per[n]とメイン関数で作成されているなぜ(

次のようにポインタを記憶するの目的は、仮想多型をサポートするためであることを理解していませんPersonのような抽象クラスはインスタンス化できません)。スマートポインタもそれに対応しますが、正しいdynamic memory managementに注意します。

C++では、生ポインタやロー配列を使用する必要はありません。このコードでは、「ベストプラクティス」の良い例はありませんです。 main()関数で

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

に応じ

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. 

} 

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

とループと置き換えなければならない。また

int marks[6]; 

std::array<int,6> marks; 

std::arrayに置き換えてください関数のパラメータとして渡されたとき、あなたは完全またはメモリリーク配列を埋めることができますので、それがある

+0

ありがとうございます。私はこれを念頭に置いておきます。 –

+0

これは当てはまりますが、なぜオブジェクト自体ではなくオブジェクトへのポインタを格納するのかという重要な問題に対処するとは思いません。 – templatetypedef

+1

@templatetypedef私は私の仲間のユーザーと思います。 "ポインタを格納する目的は仮想多型をサポートすることです..." – user4581301

関連する問題