Он не скомпилируется по следующим причинам:
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 ++, я бы никогда не использовал его, так как очень трудно находить ошибки,Найдите хорошую книгу, поймите ссылки, указатели и динамическую память.