2012-03-23 59 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; 
} 

當我嘗試使用賦值運算符行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); 
} 
+3

顯示的構造太... – UmNyobe 2012-03-23 13:02:33

+0

爲什麼你不能用'標準: :矢量's或'std :: string's,或者至少是'std :: unique_ptr 's? – Mankarse 2012-03-23 13:05:31

+0

歡迎來到Stack Overflow!這對於第一個問題並不壞,但是我們不需要看到很多代碼。將來,請嘗試發佈一個*最小*可編譯代碼示例來演示該問題。在這種情況下,唯一相關的部分是C風格的字符串。班上的其他人只是喧譁,並將我們從當前真正的問題中分散出來。 – 2012-03-23 13:16:32

回答

3

您是按值從分配函數返回。你的拷貝構造函數有可能是有缺陷的。

+0

上工作我沒有複製構造函數。我也沒有在任何地方調用複製構造函數,所以不應該是一個問題。 – 2012-03-23 13:15:43

+0

@BugalugsNash:你有一個拷貝構造函數,你調用它(否則你的代碼不會編譯)。複製構造函數是隱式定義的默認值的事實只是證明它是有缺陷的。 – Mankarse 2012-03-23 13:17:40

+0

感謝您的回覆。 我改變函數頭部到: 用戶運算符=(const的用戶和) 即返回值現在通過引用。修復了這個問題。 – 2012-03-23 13:22:56