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
đây là khai báo các hàm thành phần
đâ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)
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
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); };
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; }
(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; }
Comment