Ну, я некоторое время работаю над этим, но я не могу понять это.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include "student.h"
using namespace std;
int numofstudents = 5;
Student ** StudentList = new Student*[numofstudents];
string tempLname = "smith";
StudentList[0]->SetLname(tempLname);
#include<iostream>
#include <string>
using namespace std;
class Student {
public:
void SetLname(string lname);
void returnstuff();
protected:
string Lname;
};
#include <iostream>
#include "student.h"
#include <iomanip>
#include <cctype>
#include <cstring>
#include <string>
using namespace std;
void Student::SetLname(string lname) {
Lname = lname;
}
Все, что я хочу сделать, это установить Lname
для smith
но когда я запускаю свою программу, он сбой, не сообщив мне об ошибке после его запуска. Любая помощь будет принята с благодарностью!
Ваша проблема не связана с использованием строк. Это связано с использованием указателей.
Student ** StudentList=new Student*[numofstudents];
Это выделяет массив указателей ученика. Он не выделяет массив объектов Student. Итак, с этой строки кода у вас есть массив из 5 неверных указателей. Что является проблемой при попытке доступа к ним, как если бы они указывали на объекты Student, здесь:
StudentList[0]->SetLname(tempLname);
Чтобы эта строка была действительной, StudentList[0]
сначала должен указывать на действительный объект Student
. Вы можете либо установить его на существующий объект:
Student st;
StudentList[0] = &st;
Или вы можете выделить новый объект:
StudentList[0] = new Student;
В противном случае избавиться от дополнительного уровня косвенности:
Student * StudentList=new Student[numofstudents];
...
StudentList[0].SetLname(tempLname);
Но почему на земле вы это сделаете? Если вам нужна 1-мерная динамическая коллекция объектов Student
, используйте контейнер последовательности из стандартной библиотеки, такой как std::vector
.
Вы создали массив указателей для Student, но элементы массива не были инициализированы, поэтому разыменование любого элемента, в частности [0], приводит к сбою. Используйте "std :: vector StudentList (numofstudents)"; вместо этого с небольшими изменениями в коде "StudentList [0].SetLname(tempLname);"
change Student ** StudentList=new Student*[numofstudents];
в
Student ** StudentList=new Student*[numofstudents];
for(int i = 0; i<numofstudents; i++)
StudentList[i] = new Student();