у меня есть собственный класс, назовем его Student и основной метод. Я создаю экземпляр класса и просто хочу вывести содержимое класса.
Моя программа вылетает с ошибкой: Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Фактический код
Студент.ч
#ifndef PROG2_STUDENT_H
#define PROG2_STUDENT_H
#include <iostream>
class Student
{
private:
char *name;
char *firstName;
unsigned matriculationNumber;
unsigned semester;
public:
Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester);
~Student();
friend std::ostream &operator<<(std::ostream &ostream, const Student &student);
private:
};
#endif
Студент.cpp
#include <cstring>
#include "Student.h"
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
std::strcpy(this->name, name);
std::strcpy(this->firstName, firstName);
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
Student::~Student()
{
delete[] this->name;
delete[] this->firstName;
}
std::ostream &operator<<(std::ostream &stream, const Student &input)
{
stream << input.name << ", " << input.firstName << ": "
<< input.semester << " Semester, MA " << input.matriculationNumber;
return stream;
}
и мой главный
#include <iostream>
#include "StudentPackage/Collection/StudentCollection.h"
int main()
{
Student studentOne((char *)"Testerson", (char *)"Test", 12345, 2);
std::cout << studentOne << std::endl;
return 0;
}
Что я пробовал
Я пробовал несколько вещей, включая memcpy. Но с memcpy я не могу правильно определить размер массива символов.
Когда я меняю студенческий конструктор на следующий, у меня возникают проблемы с удалением/освобождением в деструкторе. Я предполагаю, что это в любом случае неправильный путь, но это происходит, потому что область видимости входных переменных уничтожается до вызова деструктора класса, верно?
Student::Student(char *name, char *firstName, unsigned matriculationNumber, unsigned semester)
{
this->name = name;
this->firstName = firstName;
this->matriculationNumber = matriculationNumber;
this->semester = semester;
}
Вопрос
- Как я могу правильно скопировать массив символов из конструктора (имя в это имя)?
- Как я могу правильно скопировать массив символов из конструктора (firstName в this->firstName)?
const char*
, а неchar*
. (Я подозреваю, что вы получили ошибку компиляции, но исправили ее не в том месте.) - person molbdnilo   schedule 22.05.2021std::strcpy
выделена память, вы никогда не должны использоватьdelete[]
для чего-либо, что не было получено с помощьюnew T[n]
. 2) Используйтеstd::string
. - person Evg   schedule 22.05.2021changeName(char* newName)
? Можно ли также объявитьconst char* newName
? - person Ulf Tietze   schedule 22.05.2021new T[n]
? Зачем мне здесь операторnew
? - person Ulf Tietze   schedule 22.05.2021new
, вы используетеdelete
, если вы выделяете с помощьюnew[]
, вы используетеdelete[]
, если вы выделяете с помощьюmalloc()
, вы используетеfree()
.std::strcpy()
не выделяет память: вы несете ответственность за предоставление достаточно большого буфера, т. е. вы должны сначала инициализироватьthis->name
чем-то значимым. Не забывайте о пробеле для завершающего нулевого символа. - person Evg   schedule 22.05.2021const char* newName
? - Да, еслиchangeName(x)
не должен изменять буфер, на который указываетx
, и я думаю, что это не так. - person Evg   schedule 22.05.2021