Пытаюсь выучить классы и кучу с ++ - PullRequest
0 голосов
/ 14 февраля 2012

Итак, я немного запутался в приведенном ниже коде.Это прямо цитата из C ++ для чайников 5-го издания, за исключением комментариев, которые я сделал.

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' и 'studentFriend' с использованием новой функции?

Тогда объекту student.valFriend назначаются все значениякоторые имеют объект 'studentFriend.'

Мне кажется, что последний бит кода назначает некоторый необъявленный объект-член класса 'student' ссылку на studentFriend?Возможно, кто-то мог бы объяснить это более явно.Простое исправление заключается в том, что, возможно, в тексте это подразумевалось как «student.ptrFriend», но разве они этого не видели?Может быть, я что-то упустил.В противном случае, я не понимаю синтаксис этой строки.

Помимо всего этого, код даже не компилируется.Что здесь происходит?Я полагаю, что причиной некомпиляции может быть то, что в разделе, посвященном ссылкам и указателям, содержится лишь небольшой фрагмент кода.Тем не менее, это все еще сбивает с толку.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Он не скомпилируется по следующим причинам:

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?Это неправильно на многих, многих уровнях.Лучше использовать pointer для динамической памяти или использовать объекты автоматического хранения:

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

Несмотря на то, что ваш стиль приведет к правильному коду C ++, я бы никогда не использовал его, так как очень трудно находить ошибки,Найдите хорошую книгу, поймите ссылки, указатели и динамическую память.

0 голосов
/ 14 февраля 2012

Если это из книги, поищите что-нибудь еще, пожалуйста.Это большое достижение - получить столько ошибок кодирования за несколько строк;)

Первое: вы не можете объявить член неизвестного класса:

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

Кроме этого, пожалуйста, проверьте Объяснение стека и кучи и Объясненные классы для лучшего объяснения и вГлубина информации.

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