2012-02-14 15 views
0

私は以下のコードをかなり混乱させています。 Dummies 5th edのC++から直接引用されたもので、私が作ったコメントはありません。クラスと 'ヒープ'を学ぼうとするC++

class student{ 
public: 
    int semesterHours; 
    float gpa; 
    student valFriend; //I thought to use the name of the class as a data type 
    student& refFriend; 
    student* ptrFriend; 
}; //then this line should read .. '}student;' to enable something like the above 

int main() 
{ 
    student& student = *new student; //new student object 'student' 
    student.gpa = 2.0; 

    student& studentFriend = *new student; //new student object 'studentFriend' 
    studentFriend.gpa = 4.0; 

    student.valFriend = studentFriend; 

    student.pFriend = &studentFriend; 

} 

「student」クラス内には、それ自身のオブジェクトがありますか?どのようにそれは可能ですか?私がこれを正しく見ていれば、2つの新しいオブジェクトがヒープから割り当てられ、 'student'と 'studentFriend'という新しい名前の関数が使用されていますか?

次に、student.valFriendオブジェクトには、「studentFriend」というオブジェクトのすべての値が割り当てられています。

コードの最後の部分は、私がstudentfriendという参照のクラス 'student'の宣言されていないメンバオブジェクトを割り当てているように見えますか?おそらく誰かがこれをもう少し明示的に説明するかもしれません。単純に修正したのは、おそらくテキストの中に「student.ptrFriend」であることが意図されていたのですが、それを見たことはありませんか?たぶん私は何かが欠けているかもしれない。そうでなければ、私はこの行の構文を理解していません。

これに加えて、コードはコンパイルされません。ここで何が起こっているのですか?私は、コンパイルしない理由は、参照とポインタに関するセクションのほんの少しのコードなのかもしれないと思います。それにもかかわらず、それはまだ混乱しています。

+10

これは本のサンプルコードですか?私の最初の考えは、この本を捨てて、まったく別のものを読むことです。このサンプルコードはひどいです。 –

+0

私はそれが手元の話題に関連する単なるコード束であると仮定します。それ以来、効果的に何もしません。私はちょうどそれが使用した構文のいくつかに混乱していた。特に、自分のクラス定義内の学生の目的は? – bden

+0

合意したら、別の本が必要になります。あるいは、オンラインで行ってもいいです。始めるのに適した場所はhttp://www.cplusplus.com/doc/tutorial/です。私はあなたが生徒のオブジェクトのフィールドとしてオブジェクトの生徒を持つことさえできないと思っています。生徒のオブジェクトを無限に構築するので(ポインタを持つことはできますが)。 – Pochi

答えて

1

それは次の理由のためにコンパイルされません。

class student{ 
public: 
    int semesterHours; 
    float gpa; 
    student valFriend; // this line is full of evil! 
    student& refFriend; 
    student* ptrFriend; 
}; 

ただしばらくの間だと思います。生徒は生徒の価値を救うことができます。生徒の価値を救うことができ、価値を生かすことができます。無限の大きさのオブジェクトを構築しています。あなた自身の中にオブジェクトを格納することはできません。

student& student。変数の名前をstudentとしたいとします。しかし、studentは既に採用された名前です(あなたのクラスの名前です)。また、参照を変更することはできません。一度リファレンスを作成すると修正されます。だから、struct/class場合は、オブジェクトを構築しながら、それが初期化されなければならないの参照が含まれています

class student{ 
public: 
    student(student& myFriend):refFriend(myFriend), ptrFriend(0){} 
    // if a student has no friend, we say he's his own friend: 
    student():refFriend(*this), ptrFriend(0){}   
    int semesterHours; 
    float gpa;  
    student& refFriend; 
    student* ptrFriend; 
}; 

int main() 
{ 
    student& myStudent = *(new student); //new student object 'student' 
    myStudent.gpa = 2.0; 

    student& studentFriend = *new student; //new student object 'studentFriend' 
    studentFriend.gpa = 4.0;  

    myStudent.ptrFriend = &studentFriend; 
} 

しかし、いくつかの本当に不気味なものが起こってがあります。なぜあなたはダイナミックメモリを割り当てて参照を保存したいのですか?どのように割り当てを解除するつもりですか? delete &myStudentを使用していますか?これは多くの、多くのレベルで間違っています。スタイルのあなたの種類が有効なC++コードになりますが、

class student{ 
public: 
    student(student& myFriend):refFriend(myFriend){} 
    student():refFriend(*this){} 
    int semesterHours; 
    float gpa;  
    student& refFriend; 
    student* ptrFriend; 
}; 

int main() 
{ 
    student myStudent; 
    myStudent.gpa = 2.0; 

    student studentFriend; 
    studentFriend.gpa = 4.0; 

    myStudent.ptrFriend = &studentFriend; 
} 

それがエラーを見つけることは非常に難しいことから、私が今までそれを使うことはない:それは動的メモリにpointerを使用するか、または自動ストレージオブジェクトを使用することをお勧めします。良い本を見つけて、リファレンス、ポインタ、ダイナミックメモリを理解する。

0

これが本の場合は、他のものを探してください。それはとても数行に、この多くのコーディングエラーを取得するにはかなりの成果です;)

まず:あなたは、未知のクラスのメンバを宣言することはできません。

class student{ 
public: 
    // ... 
    student valFriend; //<- impossible, class student is not known, yet 
    student& refFriend; // impossible without initialization constructor 
    // ... 
};  

秒:コードは、無効決してあることに加えnewまたはmallocで検索されたポインタを参照解除する - 後で削除することを忘れるため、メモリはほとんど失われる可能性があります(別名リーク)。あなたは、この特定のサンプルのためにこのような何かを行うことができます。それ以外は

student james; 
student jim; 

james.ptrFriend = &jim; // stores the pointer to jim 

、より良い説明と、詳細な情報については、Stack and Heap explainedClasses explainedを確認してください。

関連する問題