Announcement

Collapse
No announcement yet.

Vấn đề về hàm Destructor

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

  • [C++] Vấn đề về hàm Destructor

    Em có một bài tập về phần chuỗi. Đề bài yêu cầu xây dựng lớp CString để biểu diễn khái niệm chuỗi kí tự. Khai báo các phương thức thiết lập, hủy bỏ, các hàm thành phần và các phép toán cần thiết.
    Vấn đề của em là tại hàm Destructor, máy báo lỗi "Debug Assertion Failed ..."
    Theo như em chạy debug thử thì thấy trước khi "return count" trong hàm strlen, chương trình đã gọi hàm Destructor để hủy đối tượng, nên sau khi return giá trị, chuỗi đã bi xóa. Sau khi kết thúc hàm strcmp, đối tượng a bị hủy lần thứ 2 nên báo lỗi.
    Em cũng đã tìm hiểu trên các diễn đàn về vấn đề này nhưng chưa tìm ra cách khắc phục, chỉ có cách xóa hàm Destructor đi.
    Mong anh chị hay bạn nào biết có thể khắc phục giúp em vấn đề này!

    đây là phần khai báo lớp
    Code:
    class CString
    {
    private:
    	char *Str;
    public:
    	CString();
    	~CString();
    
    	CString operator + (CString);
    	CString operator = (CString);
    
            bool operator == (CString);
    	bool operator > (CString);
    	bool operator < (CString);
    
    	friend istream& operator >> (istream &is, CString &p);
    	friend ostream& operator << (ostream &os, CString p);
    
    	friend int strcmp(const CString, const CString);
    	friend int strlen(const CString);
    	friend CString strcpy(CString, const CString);
    	friend CString strcat(CString, const CString);
    };
    đây là khai báo các hàm thành phần
    Code:
    //Constructor
    CString::CString()
    {
    	Str = NULL;
    }
    CString::~CString()
    {
    	cout << "Da huy" << endl;
    	//delete[] Str;
    	Str = NULL;
    }
    //Ham noi 2 CString
    CString CString::operator + (CString b)
    {
    	return strcat(*this, b);
    }
    
    //Overload toan tu =
    CString CString::operator = (CString b)
    {
    	Str = new char[strlen(b)];
    	strcpy(Str, b.Str);
    	return *this;
    }
    
    bool CString::operator > (CString b)
    {
    	return strcmp(*this, b) > 0;
    }
    bool CString::operator < (CString b)
    {
    	return strcmp(*this, b) < 0;
    }
    istream& operator >> (istream &is, CString &p)
    {
    	p.Str = new char[100];
    	is.getline(p.Str, 100);
    	return is;
    }
    ostream& operator << (ostream &os, CString p)
    {
    	os << p.Str;
    	return os;
    }
    đây là hàm main và các hàm friend của lớp
    (báo lỗi ngay tại hàm strcmp bên dưới)
    Code:
    //Viet lai(overload) cac ham co san trong thu vien string.h cho lop CString
    int strcmp(const CString a, const CString b)
    {
    	int i = 0;
    	int j = min(strlen(a), strlen(b));
    	while(a.Str[i++] == b.Str[i++] && i <= j){}
    	return a.Str[--i] - b.Str[--i];          //Báo lỗi ở đây
    }
    int strlen(const CString a)
    {
    	int count = 0;
    	while(a.Str[count++] != NULL);
    	return --count;
    }
    CString strcpy(CString dest, const CString source)
    {
    	int i = 0;
    	while(source.Str[i] != NULL)
    		dest.Str[i] = source.Str[i++];
    	return dest;
    }
    CString strcat(CString dest, const CString source)
    {
    	int i = strlen(dest);
    	int j = 0;
    	while(source.Str[j] != NULL)
    		dest.Str[i++] = source.Str[j++];
    	dest.Str[i] = NULL;
    	return dest;
    }
    
    void main()
    {
    	CString a;
    	cin >> a;
    	CString b;
    	cin >> b;
    	
    	if(a > b)
    		cout << ">" << endl;
    	else if(a < b)
    		cout << "<" << endl;
    	else
    		cout << "=" << endl;
    
    	cout << a + b << endl;
    }
    trong chương trình em đã định nghĩa lại các hàm strlen, strcmp, strcpy, strcat cho kiểu dữ liệu CString
    Last edited by 13520747; 20-05-2014, 22:58.
    Đừng bán rẻ mình...
    Mà phải BÁN ĐÚNG GIÁ!!!

  • #2
    Chúng tôi quan ngại sâu sắc về việc bạn không nói rõ HÀNG CODE NÀO BỊ LỖI. Đây là hành động mang tính thách đố người đọc và không có ích cho quá trình debug cũng như đi ngược lại nội quy bạn à.

    Comment


    • #3
      Originally posted by sinhvien.uit View Post
      Chúng tôi quan ngại sâu sắc về việc bạn không nói rõ HÀNG CODE NÀO BỊ LỖI. Đây là hành động mang tính thách đố người đọc và không có ích cho quá trình debug cũng như đi ngược lại nội quy bạn à.
      Vâng quả là em có sai sót
      em đã sửa lại trong chương trình.
      Em xin cảm ơn
      Đừng bán rẻ mình...
      Mà phải BÁN ĐÚNG GIÁ!!!

      Comment


      • #4
        Em làm sao chạy được lệnh này trong hàm main hay thế. Tới đây là lỗi biên dịch rồi làm gì chạy được hàm strcmp của em tự viết nữa mà có lỗi runtime
        Originally posted by 13520747 View Post
        (báo lỗi ngay tại hàm strcmp bên dưới)
        Code:
        //Viet lai(overload) cac ham co san trong thu vien string.h cho lop CString
        void main()
        {
        	CString a;
        	cin >> a;
        	CString b;
        	cin >> b;
        	
        [B][SIZE=5]	if(a > b)[/SIZE][/B]
        		cout << ">" << endl;
        	else if(a < b)
        		cout << "<" << endl;
        	else
        		cout << "=" << endl;
        
        	cout << a + b << endl;
        }
        trong chương trình em đã định nghĩa lại các hàm strlen, strcmp, strcpy, strcat cho kiểu dữ liệu CString

        Comment


        • #5
          Code bạn nhiều quá mình đọc ko nỗi . Mình làm thế này và thấy hết lỗi . Thử xem sao nhé
          Code:
          CString::~CString()
          {
          
          	if(Str!=NULL)
          	       delete []Str;
          	Str = NULL;
          }

          Comment


          • #6
            Bạn cho mình hỏi chỗ này
            Code:
            istream& operator >> (istream &is, CString &p)
            {
            	p.Str = new char[100];
            	is.getline(p.Str, 100);
            	return is;
            }
            sao bạn biết là 100, lỡ người ta dùng ít hơn hay nhiều hơn thì sao ?.

            Comment


            • #7
              Nhiều giả thuyết thật. Nói chung chủ thớt không đưa đủ code mà cũng không nói rõ chạy với dữ liệu gì thì lỗi nên khó mà đoán. Tui chỉ có một thắc mắc tại sao các bạn phải code nhiều thế này trong khi chúng ta có thể dùng chiêu

              Code:
              #include <string>
              class CStrings : public string { };
              Last edited by truonganpn; 20-05-2014, 19:29.

              Comment


              • #8
                Originally posted by truonganpn View Post
                Nhiều giả thuyết thật. Nói chung chủ thớt không đưa đủ code mà cũng không nói rõ chạy với dữ liệu gì thì lỗi nên khó mà đoán. Tui chỉ có một thắc mắc tại sao các bạn phải code nhiều thế này trong khi chúng ta có thể dùng chiêu

                Code:
                #include <string>
                class CStrings : public string { };
                đi thi em làm cách này thầy chấm điển sao vậy

                Comment


                • #9
                  Chiêu gì đây thầy

                  Originally posted by truonganpn View Post
                  Nhiều giả thuyết thật. Nói chung chủ thớt không đưa đủ code mà cũng không nói rõ chạy với dữ liệu gì thì lỗi nên khó mà đoán. Tui chỉ có một thắc mắc tại sao các bạn phải code nhiều thế này trong khi chúng ta có thể dùng chiêu

                  Code:
                  #include <string>
                  class CStrings : public string { };

                  Comment


                  • #10
                    Originally posted by truonganpn View Post
                    Nhiều giả thuyết thật. Nói chung chủ thớt không đưa đủ code mà cũng không nói rõ chạy với dữ liệu gì thì lỗi nên khó mà đoán. Tui chỉ có một thắc mắc tại sao các bạn phải code nhiều thế này trong khi chúng ta có thể dùng chiêu

                    Code:
                    #include <string>
                    class CStrings : public string { };
                    Dùng chiêu xong có bị ăn 0 hok ạ. Chắc là tự làm để hiểu về OOP thôi,

                    Im a british accent lover

                    Comment


                    • #11
                      Originally posted by 12520167 View Post
                      đi thi em làm cách này thầy chấm điển sao vậy
                      Thường dạng bài này tui yêu cầu cài lớp đa thức chứ không cài lớp string. Các bạn cài lớp strings thường nản giữa chừng đặc biệt là khi thư viện chuẩn đã có sẵn và cài khá tốt. Nếu các bạn muốn làm lại cho hiểu thì phải thật kiên nhẫn, và nên cài các hàm thành phần, các toán tử giống y chang như lớp sting của thư viện, đừng chế thêm làm gì. Ví dụ như trong lớp string lại có cái hàm friend strcmp là thấy sai rồi vì overload các toán tử so sánh cho nó sẽ tiện hơn nhiều.

                      Các bạn có thể mở mã nguồn các thư viện C++ chuẩn ra để xem cách họ làm nếu cần: http://gcc.gnu.org/libstdc++/

                      Originally posted by 13520549 View Post
                      Chiêu gì đây thầy
                      Học tới kế thừa là biết chiêu này.

                      Comment


                      • #12
                        Originally posted by truonganpn View Post
                        Em làm sao chạy được lệnh này trong hàm main hay thế. Tới đây là lỗi biên dịch rồi làm gì chạy được hàm strcmp của em tự viết nữa mà có lỗi runtime
                        do lúc em post lên đây sơ ý xóa mấy hàm so sánh mà quên để ý là trong hàm main có sử dụng :3
                        dĩ nhiên là trong project của em vẫn có đủ những hàm đó nên em không nhận ra
                        cảm ơn thầy!
                        Đừng bán rẻ mình...
                        Mà phải BÁN ĐÚNG GIÁ!!!

                        Comment


                        • #13
                          Originally posted by 13520549 View Post
                          Code bạn nhiều quá mình đọc ko nỗi . Mình làm thế này và thấy hết lỗi . Thử xem sao nhé
                          Code:
                          CString::~CString()
                          {
                          
                          	if(Str!=NULL)
                          	       delete []Str;
                          	Str = NULL;
                          }
                          mình cũng đã thử cách này trước đó nhưng không được bạn ơi

                          Originally posted by 12520167 View Post
                          Bạn cho mình hỏi chỗ này
                          Code:
                          istream& operator >> (istream &is, CString &p)
                          {
                          	p.Str = new char[100];
                          	is.getline(p.Str, 100);
                          	return is;
                          }
                          sao bạn biết là 100, lỡ người ta dùng ít hơn hay nhiều hơn thì sao ?.
                          chỗ này tạm thời em chưa quan tâm đến
                          nhưng anh có giải pháp gì cho việc cấp phát động chuỗi kí tự không ạ?
                          Đừng bán rẻ mình...
                          Mà phải BÁN ĐÚNG GIÁ!!!

                          Comment


                          • #14
                            Originally posted by truonganpn View Post
                            Ví dụ như trong lớp string lại có cái hàm friend strcmp là thấy sai rồi vì overload các toán tử so sánh cho nó sẽ tiện hơn nhiều.
                            Nếu như cài đặt là hàm thành phần thì em phải viết là a.strcmp(b) hay a.strlen(), ... Như vậy đâu có giống với cấu trúc các hàm có sẵn đâu thầy?
                            Đừng bán rẻ mình...
                            Mà phải BÁN ĐÚNG GIÁ!!!

                            Comment


                            • #15
                              Originally posted by truonganpn View Post
                              Nhiều giả thuyết thật. Nói chung chủ thớt không đưa đủ code mà cũng không nói rõ chạy với dữ liệu gì thì lỗi nên khó mà đoán. Tui chỉ có một thắc mắc tại sao các bạn phải code nhiều thế này trong khi chúng ta có thể dùng chiêu

                              Code:
                              #include <string>
                              class CStrings : public string { };
                              siêu bựa dành cho thi cử

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X