2012-03-23 10 views
1

私はこのようになりますクラスのユーザーを持っている:、オーバーロード代入演算子のコピーではないchar型のポインタが正しく

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という行は、動的char配列以外のすべてが正しく割り当てられます。

operator = functionの最後のテスト出力は、割り当ての終わりにすべてが完全に機能していることを示しています(ユーザ名とパス名は正しい)が、割り当て直後のmain関数からのテスト出力は、突然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

+0

は、なぜあなたは 'のstdを使用することはできません。 :ベクトル 'または' std :: string's、または少なくとも 'std :: unique_ptr ' s? – Mankarse

+0

ようこそスタックオーバーフロー!これは最初の質問では悪いことではありませんが、そこには見る必要のないコードがたくさんあります。将来的には、問題を示す最小限の*コンパイル可能なコードサンプルを投稿してください。この場合、関連する唯一の部分はCスタイルの文字列です。クラスの残りの部分はちょうど騒音であり、手元の本当の問題から私たちをそらす。 –

答えて

3

あなたは割り当て関数から値で戻ってきているコンストラクタです。コピーコンストラクタに欠陥がある可能性があります。あなたがここにこのチュートリアルをチェックアウトする場合があります

+0

私はコピーコンストラクタを持っていません。私はまた、コピーコンストラクタをどこにでも呼び出さず、問題ではないはずです。 –

+0

@BugalugsNash:コピーコンストラクタを持っていますが、それを呼び出すことはできません(そうしないと、コードはコンパイルされません)。コピーコンストラクタが暗黙的に定義されたデフォルトのものであるという事実は、それが欠陥があることを証明するだけです。 – Mankarse

+0

お返事ありがとうございます。 私は機能ヘッダを変更: ユーザー&演算子=(CONSTユーザー&) すなわち戻り値は参照によるものです。問題を修正しました。 –

関連する問題