我有一類用戶,看起來像這樣:重載賦值運算符 - 字符指針不是抄襲正確
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 = function結尾處的測試輸出顯示,在賦值結束時,一切都完美地工作(用戶名和路徑名是正確的),但是直接在賦值之後主函數的測試輸出顯示所有突然間,char數組發生了變化。突然,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);
}
顯示的構造太... – UmNyobe 2012-03-23 13:02:33
爲什麼你不能用'標準: :矢量's或'std :: string's,或者至少是'std :: unique_ptr 's? –
Mankarse
2012-03-23 13:05:31
歡迎來到Stack Overflow!這對於第一個問題並不壞,但是我們不需要看到很多代碼。將來,請嘗試發佈一個*最小*可編譯代碼示例來演示該問題。在這種情況下,唯一相關的部分是C風格的字符串。班上的其他人只是喧譁,並將我們從當前真正的問題中分散出來。 – 2012-03-23 13:16:32