Announcement

Collapse
No announcement yet.

[Help] Lỗi Hàm ~String Trong Lớp String

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Originally posted by 11520327 View Post
    đã sửa xong.
    Code:
    #include<iostream>
    #include<conio.h>
    
    using namespace std;
    
    
    class STRING
    {
    private:
    	char *Content;
    	int Lenght;
    public:
    	STRING();
    	STRING(char* s);
    	STRING(const STRING &a);
    	STRING operator=(const STRING& p);
    	~STRING();
    	friend STRING operator+(const STRING& p,const STRING& q);
    	void Xuat();
    };
    
    STRING::STRING()
    {
    	Content=NULL;
    	Lenght=0;
    }
    STRING::STRING(char* s)
    {
    	Lenght=strlen(s);
    	Content=new char [Lenght+1];
    	strcpy(Content,s);
    }
    STRING::STRING(const STRING &a)
    {
    	Content=new char[a.Lenght+1];
    	strcpy(Content, a.Content);
    }
    STRING STRING::operator = (const STRING& p)
    {
    	if(Content)
    		delete[]Content;
    	Lenght=strlen(p.Content);
    	Content=new char [Lenght+1];
    	strcpy(Content,p.Content);
    	return *this;
    }
    STRING::~STRING()
    {
    	delete []Content;
    	Lenght=0;
    }
    STRING operator+(const STRING& p,const STRING& q)
    {
    	STRING t;
    	t.Lenght=p.Lenght+q.Lenght;
    	t.Content=new char [t.Lenght+1];
    	strcpy(t.Content,p.Content);
    	strcat(t.Content,q.Content);
    	return t;
    }
    void STRING::Xuat()
    {
    	cout<<Content<<"\n";
    }
    
    void main()
    {
    	STRING x,y("DH CNTT"),z=" DHQG";
    	y.Xuat();
    	z.Xuat();
    	x= y+z;
    	x.Xuat();
    	getch();
    }
    thêm hàm khởi tạo sao chép copy. nhớ là nếu dùng cấp phát động thì phải viết hàm này.
    Code:
     STRING::STRING(const STRING &a)
    {
    	Content=new char[a.Lenght+1];
    	strcpy(Content, a.Content);
    }
    sửa lại hàm toán tử gán bằng. bởi vì nếu Content chưa được khởi tạo mà gọi hàm delete sẽ lỗi nên phải kiểm tra trước.
    Code:
    STRING STRING::operator = (const STRING& p)
    {
    	if(Content)
    		delete[]Content;
    	Lenght=strlen(p.Content);
    	Content=new char [Lenght+1];
    	strcpy(Content,p.Content);
    	return *this;
    }
    giải thích cái sửa thứ nhất:
    khi trình biên dịch gặp câu lệnh return t trong hàm operator +,
    trình biên dịch sẽ tạo ra 1 biến mới là bản sao của t( tạo bằng cách gọi hàm khởi tạo sao chép), biến mới là biến dùng để trả về( chú ý không phải là t nha).
    do không có định nghĩa hàm này nên trình biên dịch sẽ gọi hàm khởi tạo sao chép ngầm định( hàm này sẽ sao chép từng bít từ vùng nhớ biến t sang biến mới),
    do đó, con trỏ Content trong biến mới và con trỏ Content trong t trỏ đến cùng 1 vùng nhớ.
    sau đó, hàm kết thúc, biến t là biến cục bộ nên sẽ gọi hàm hủy tương ứng, hàm này xóa luôn vùng nhớ chung của t và biến mới. do đó, vùng nhớ mà Content( biến mới) sẽ bị xóa.
    hàm operator + trả về biến mới với thành phần Content "rỗng".
    cái hàm operator = kiểu trả về nên là STRING & thì đúng nghĩa hơn.
    Top Best Online - The Best Products Review Website

    Comment


    • #17
      Cũng lưu ý là nếu thuộc tính có kiểu là con trỏ hoặc tham chiếu thì destructor , copy constructor , toán tử gán thật sự cần thiết để compiler chính xác
      Ngoài ra thì char* , xài strdup cho nó tiện . Nó tự động gọi hàm malloc để lấy bộ nhớ , sau đó sẽ copy chuỗi . Tiện hơn khi xài strcpy nhiều
      Bác cũng nên xài string thay cho char là vừa , string lưu động hơn và đã thông đc thì sau này dễ dàng tiếp cận "String" và "string" của C# :sexy:
      Last edited by 11520235; 26-12-2012, 01:28.

      Comment

      LHQC

      Collapse
      Working...
      X