Ух ты.
Есть несколько проблем, , но ваш segfault, вероятно, из-за того, что вы передаете char*
- просто указатель, а затем пытаетесь cout
ввести его в disp()
. Проблема в том, что указатель не живет в disp()
, он живет в main()
. Вы, вероятно, хотите либо глубоко скопировать char*
, либо использовать std::string
. Это не сработает.
РЕДАКТИРОВАТЬ :
См. РЕДАКТИРОВАТЬ 2
Вы не можете просто присвоить имя переменной name
класса. Если вы сделаете это, вы получите непредсказуемые результаты - и вы, вероятно, по-прежнему Сегфо. Помните: в C / C ++ объекты локально ограничены, если не размещены в куче. В этом случае в вашем ctor вы захотите сделать что-то вроде:
this->name = new char[ strlen( name ) + 1 ];
strcpy( this->name, name );
А в деструкторе вы захотите сделать что-то вроде:
delete [] this->name;
Примечание: мой синтаксис может быть совершенно неверным, и я понимаю, что приведенный выше код небезопасен, поскольку вы не проверяете char*
, чтобы убедиться, что он не равен NULL, и вы не проверяете возвращаемое значение new.
Тем не менее, это должно начать вас.
РЕДАКТИРОВАТЬ 2:
Я стою исправлено. Строковые литералы обрабатываются как постоянное хранилище и, таким образом, живут в течение всей программы Тем не менее , урок, на мой взгляд, важен: в общем случае, когда не имеет дело со строковыми литералами , передавая указатель (или массив и т. Д.), Вам нужно выделить память для это и глубокая копия. Вам также необходимо соответствующим образом отменить выделение при уничтожении указанного объекта.