Как вы используете строки в классе?

0

Ну, я некоторое время работаю над этим, но я не могу понять это.

#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 но когда я запускаю свою программу, он сбой, не сообщив мне об ошибке после его запуска. Любая помощь будет принята с благодарностью!

  • 0
    Спасибо, ребята, я хотел бы спросить об этом раньше: p
Теги:
class
string

3 ответа

2

Ваша проблема не связана с использованием строк. Это связано с использованием указателей.

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.

0

Вы создали массив указателей для Student, но элементы массива не были инициализированы, поэтому разыменование любого элемента, в частности [0], приводит к сбою. Используйте "std :: vector StudentList (numofstudents)"; вместо этого с небольшими изменениями в коде "StudentList [0].SetLname(tempLname);"

0

change Student ** StudentList=new Student*[numofstudents]; в

Student ** StudentList=new Student*[numofstudents];
for(int i = 0; i<numofstudents; i++)
    StudentList[i] = new Student();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню