2012-03-23 2 views
1

У меня есть пользовательский класс, который выглядит следующим образом:перегружен Оператор присваивания - символьные указатели не копируют правильно

class User 
{ 
    private: 
     char* p_username; 
     int nProcesses; 
     struct time 
     { 
      int mins; 
      int secs; 
     } totalTime;   
     int longestPID;  
     char* p_longestPath;  
    public: 
     User(); 
     User(const char[],int,int,int,const char[]); 
     ~User(); 
     User operator=(const User&); 
     // Other functions 
}; 

И перегруженная функция оператора присваивания:

User User::operator=(const User &u) 
{ 
    if (this != &u) 
    { 
     delete [] p_username; 
     delete [] p_longestPath; 
     p_username = new char[strlen(u.p_username)+1]; 
     strcpy(p_username,u.p_username); 
     nProcesses = u.nProcesses; 
     totalTime.mins = u.totalTime.mins; 
     totalTime.secs = u.totalTime.secs; 
     longestPID = u.longestPID; 
     p_longestPath = new char[strlen(u.p_longestPath)+1]; 
     strcpy(p_longestPath,u.p_longestPath); 
    } 
    return *this; 
} 

Образец основной программы с использованием оператор присваивания:

int main() 
{ 
    cout << "\n\nProgram\n\n"; 

    User u("Username",20,30,112233,"Pathname"),u2; 
    u2 = u; 
} 

Когда я пытаюсь использовать оператор присваивания в line u2 = u, все назначается должным образом, за исключением массивов динамических символов.

Тестовый выход с конца функции operator = показывает, что в конце самого присваивания все работает отлично (имена пользователей и пути правильны), однако тестовый вывод из основной функции непосредственно после назначения показывает, что все внезапно изменились массивы символов. Внезапно имя пользователя u2 пусто, а первая половина пути - мусор.

Если в конце функции оператора присваивания имя пользователя и путь прекрасны, как они могут быть неверными в вызывающей функции?

Это действительно меня в тупик ...

Edit: Вот Конструкторы

User::User() 
{ 
    p_username = 0; 
    nProcesses = 0; 
    totalTime.mins = 0; 
    totalTime.secs = 0; 
    longestPID = -1; 
    p_longestPath = 0; 
} 


User::User(const char UID[],int minutes,int seconds,int PID,const char path[]) 
{ 
    p_username = new char[strlen(UID)+1]; 
    strcpy(p_username,UID); 
    nProcesses = 1; 
    totalTime.mins = minutes; 
    totalTime.secs = seconds; 
    longestPID = PID; 
    p_longestPath = new char[strlen(path)+1]; 
    strcpy(p_longestPath,path); 
} 
+3

показать конструктор тоже ... – UmNyobe

+0

Почему вы не можете использовать 'зЬй: : vector 's, или' std :: string 'или, по крайней мере,' std :: unique_ptr 's? – Mankarse

+0

Добро пожаловать в переполнение стека! Это не плохо для первого вопроса, но там много кода, который нам не нужно видеть. В будущем, пожалуйста, попробуйте опубликовать * минимальный * компилируемый пример кода, который демонстрирует проблему. В этом случае единственными важными являются строки C-стиля. Остальная часть класса - это просто шум и отвлекает нас от реальной проблемы. –

ответ

3

Вы возвращающиеся по значению из функции присваивания. Возможно, что ваш конструктор копирования ошибочен.

+0

У меня нет конструктора копирования. Я также не называю конструктор копирования нигде, поэтому это не должно быть проблемой. –

+0

@BugalugsNash: У вас есть конструктор копирования, и вы вызываете его (иначе ваш код не будет компилироваться). Тот факт, что конструктор копирования неявно определен по умолчанию, просто доказывает, что он ошибочен. – Mankarse

+0

Спасибо за ответы. Я изменил заголовок функции для: пользователя и оператора = (& сопзИ пользователя) Т.е. возвращаемое значение теперь по ссылке. Исправлена ​​проблема. –