У меня есть пользовательский класс, который выглядит следующим образом:перегружен Оператор присваивания - символьные указатели не копируют правильно
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);
}
показать конструктор тоже ... – UmNyobe
Почему вы не можете использовать 'зЬй: : vector 's, или' std :: string 'или, по крайней мере,' std :: unique_ptr 's? –
Mankarse
Добро пожаловать в переполнение стека! Это не плохо для первого вопроса, но там много кода, который нам не нужно видеть. В будущем, пожалуйста, попробуйте опубликовать * минимальный * компилируемый пример кода, который демонстрирует проблему. В этом случае единственными важными являются строки C-стиля. Остальная часть класса - это просто шум и отвлекает нас от реальной проблемы. –