Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: [ Solved ]Hàm tạo sao chép

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    5

    Mặc định [ Solved ]Hàm tạo sao chép

    Tôi có đoạn code sau :
    PHP Code:
    #include <iostream>
    #include <iomanip>
    #include <string>
    using namespace std;
    class 
    Nguoi
    {
    private:
        
    int age;
        
    char *name;
    public:
        
    Nguoi(char_name,int _age)
        {
            
    age=_age;
            
    int t;
            
    t=strlen(_name);
            
    name=new char[t+1];
            
    strcpy(name,_name);
        }
        ~
    Nguoi()
        {
            
    age=0;
            
    name=NULL;
        }
        
    Nguoi(const Nguoid)
        {
            
    this->age=d.age;
            
    strcpy(name,d.name);
        }
        
    void show()
        {
            
    cout<<"\nTen:"<<name<<" tuoi:"<<age;
        }
    };
    int main()
    {
        
    Nguoi n1("Tran Van Teo",22);
        
    n1.show();
        
    n1.~Nguoi();
        
    Nguoi n2(n1);
        
    n2.show();
        
    cin.get();
        return 
    0;

    Tại sao n2 lại không copy được constructor của n1 nhỉ?hàm tạo sao chép đó tôi viết phải sửa lại thế nào?

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Không chỉ có lỗi ở copy constructor mà còn nhiều lỗi nữa :
    C++ Code:
    1. private:
    2.     int age;
    3.     char *name;
    4. public:
    5.     Nguoi(char* _name,int _age)
    6.     {
    7.         age=_age;
    8.         int t;
    9.         t=strlen(_name);
    10.         name=new char[t+1];
    11.         strcpy(name,_name);
    12.     }
    - Thứ tự khai báo dữ liệu và tham số pass vào constructor là quan trọng, có lúc sẽ ok nhưng có lúc sẽ sai.
    - Dùng strcpy thì không có nghĩa nó sẽ có kí tự NULL trong chuỗi, bắt buộc phải thêm vào vì đây là cstring, tui sẽ cho 1 ví dụ với C++ string.
    - Nếu muốn dùng kiểu copy thì có 2 cách hoặc là thêm vào sau cùng, hoặc là thêm vào đầu hoặc là thêm sau cùng.
    C++ Code:
    1. name = new char[length_of_n + 1];
    2. *name = '\0';
    3. strcpy(name, n);
    C++ Code:
    1. name = new char[length_of_n + 1];
    2. strcpy(name, n);
    3. name[length_of_n] = '\0';
    Tui sẽ chọn cách thêm vào đầu để khỏi viết thêm 1 biến.
    - Copy constructor phải kiểm tra trường hợp nó tự gán cho chính nó. Sthing like :
    C++ Code:
    1.  if(this == &rhs)
    2.         std::cerr << "Don't assign your self...\n";
    - Hàm hủy của cậu sẽ dẫn đến memory leak, nhớ là khi dữ liệu có con trỏ, tạo ngay 1 hàm delete[] và comment nó để tí nhớ mà dùng.
    C++ Code:
    1. ~Nguoi(){
    2.       std::cout << "\n....Im releasing memory.\n.";
    3.       delete[] name;
    4.       name = 0;
    5.     }
    - Hàm nào không đá động tới dữ liệu, gán ngay cho nó const :
    C++ Code:
    1. void show() const{
    2.       std::cout << "\nTen : " << name << " \ntuoi : " <<age;
    3.     }
    Demo C string :
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. #include <string>
    4.  
    5. class Nguoi{
    6. private:
    7.     int age;
    8.     char *name;
    9. public:
    10.   Nguoi(int age, const char* n):age(age){
    11.     name = new char[strlen(n)+ 1];
    12.     *name = '\0';
    13.     strcpy(name, n);
    14.   }
    15.   ~Nguoi(){
    16.       std::cout << "\n....Im releasing memory.\n.";
    17.       delete[] name;
    18.       name = 0;
    19.     }
    20.     Nguoi(const Nguoi& rhs){
    21.       if(this == &rhs)
    22.         std::cerr << "Don't assign your self...\n";
    23.       else{
    24.         name = new char[strlen(rhs.name) + 1];
    25.         *name = '\0';
    26.         this->age = rhs.age;
    27.         strcpy(name, rhs.name);
    28.       }
    29.     }
    30.     void show() const{
    31.       std::cout << "\nTen : " << name << " \ntuoi : " <<age;
    32.     }
    33. };
    34.  
    35. int main()
    36. {
    37.     Nguoi n1(22, "Nguyen Van Teo");
    38.     n1.show();
    39.     Nguoi n2(n1);
    40.     n2.show();
    41.     return 0;
    42. }

    Demo C++ string :
    C++ Code:
    1. class Nguoi{
    2. private:
    3.     int age;
    4.     std::string name;
    5. public:
    6.   Nguoi(int age, std::string name):age(age), name(name){
    7.   }
    8.   ~Nguoi(){
    9.       std::cout << "\n....Im releasing memory.\n.";
    10.   }
    11.   Nguoi(const Nguoi& rhs){
    12.     if(this == &rhs)
    13.       std::cerr << "Don't assign your self...\n";
    14.     else{
    15.       age = rhs.age;
    16.       name = rhs.name;
    17.     }
    18.   }
    19.   void show() const{
    20.     std::cout << "\nTen : " << name << " \ntuoi : " <<age;
    21.   }
    22. };
    23.  
    24. int main()
    25. {
    26.     Nguoi n1(22, "Nguyen Van Teo");
    27.     n1.show();
    28.     Nguoi n2(n1);
    29.     n2.show();
    30.     return 0;
    31. }

Các đề tài tương tự

  1. [ Solved ]Xây dựng lớp ĐỒTHI
    Gửi bởi bluesky_123078 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-11-2008, 09:34 AM
  2. [Solved] Hỏi về con trỏ
    Gửi bởi RedHatLinux9 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 17-09-2008, 08:01 AM
  3. [ Solved ]Cấp phát động
    Gửi bởi demontaihack trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 07-09-2008, 08:23 PM
  4. [ Solved ]Cần hướng dẫn về bài tập màng!!
    Gửi bởi itthuyloi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-06-2008, 03:00 PM
  5. [ Solved ]Sắp xếp hai dãy số
    Gửi bởi thuchanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 20-04-2008, 11:47 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn