У меня есть класс User, который выглядит следующим образом:
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;
}
Когда я пытаюсь использовать оператор присваивания в строке u2 = u, все назначается правильно, кроме динамических массивов символов.
Тестовый вывод с конца функции operator = показывает, чтов конце самого присваивания все работает отлично (имена пользователей и пути указаны правильно), однако тестовый вывод основной функции непосредственно после присваивания показывает, что массивы символов внезапно изменились.Внезапно имя пользователя u2 становится пустым, и первая половина пути становится мусором.
Если в конце функции оператора присваивания имя пользователя и путь идеальны, как они могут быть неверными в вызывающей функции??
Это действительно меня озадачило ...
Редактировать: Вот конструкторы
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);
}