2014-11-24 2 views
0

У меня возникли некоторые проблемы с изменением указателя обугленного и не могу понять, где я буду неправильноПроблем с изменением константного символа указатель

Вот моя функция для изменения описания ...

void appointment::changeDescription(const char * s) // change an existing description 
{ 

if (desc != NULL) 
    strcpy(desc, s); 

if (s == NULL) 
    return; 

} 

И вот функция, которая вызывает функцию описания изменений.

bool keyBoardEnterAppointment(schedule & sched) // return true if successful 
// return false if full 
{ 
    if (sched.isFull() == true) 
    { 
     cout << "Schedule is FULL." << endl; 
     return false; 
    } 
    else 
    { 
    appointment s; 
    int day, month, year; 
    char *desc = new char; 
    long source; 

    cout << "*/Enter Appointment\\* "; 
    cout << "Description: "; cin >> desc; 
    cout << "Source: "; cin >> source; 

    cout << "Month: "; cin >> month; 
    cout << "Day: "; cin >> day; 
    cout << "Year: "; cin >> year; 

    s.changeDescription(desc); 
    s.setSource(source); 
    s.setDay(day); 
    s.setMonth(month); 
    s.setYear(year); 
    sched.addtoSchedule(s); 

    sched.print(cout); 

    return true; 
} 

}

Он компилируется и работает, но описание остается такой же, как описание конструктора по умолчанию ...

+5

Сделайте жизнь проще для себя и просто используйте 'std :: string'. – shuttle87

+5

'char * desc = new char;' Это выделяет достаточно памяти для одной буквы. Возможно, попробуйте: 'char * desc = new char [32]; // 31 символ (+1 для терминатора) '. Или char 'desc [32];' тогда вам не придется 'delete []' it (что вы здесь не делали). – Galik

+0

Не следует ли сначала проверять, является ли 's'? –

ответ

2

Если вы используете std::string для сохранения описания в классе назначения, то вы можете сделать вещи намного проще для вас самих и для людей, которые в конечном итоге работают над вашим кодом. Метод changeDescription тогда стал бы это:

#include <string> 

void appointment::changeDescription(std::string const& s){ 
    this->desc = s; 
} 

И изменить код вызова на это:

std::string desc; 

Тогда все раздражающего управления памятью, что вызывает проблемы, стоящие перед вами фиксированы в значительной степени бесплатно (с точки зрения усилий по программированию). Вообще говоря, это считается лучшим идиоматическим кодом на C++, чем использование массивов символов C-style с нулевым завершением.

Другое дело о том, что вы действительно должны проверить, что s не имеет значения null, прежде чем вы попытаетесь скопировать его, а не потом.

+2

На самом деле, лучше принять аргумент по значению и использовать 'std :: move' при назначении. – Deduplicator

+0

@Deduplicator, если доступно 'std :: move', я полностью согласен, что это способ сделать это. Положите это как ответ, я бы, скорее всего, его поддержал. Я просто пытался сделать простую замену для того, что было в вопросе. – shuttle87

Смежные вопросы