我有兩個類將創建一個動態分配的cstring(空終止)n大小的對象正在創建該類。在一個類中,我有一個成員函數重載等價運算符,而在另一個類中,我有一個非成員函數重載等價運算符。我使用strcmp來比較每個類類型的兩個cstrings,不管我初始化該數組,它總是返回true。這兩個不同大小的cstrings是否應該用strcmp返回0(等於)?
int main() {
CSTR cstr(5);
CSTR cstr2(6);
if (cstr == cstr2)
cout << "Equal"; //<< Always returns true
else
cout << "False";
cout << "\n\n";
CSTR2 cstr2_1(5);
CSTR2 cstr2_2(6);
if (cstr2_1 == cstr2_2)
cout << "Equal"; //<< Always returns true
else
cout << "False";
return 0;
}
==============================
class CSTR {
public:
CSTR();
CSTR(unsigned int n);
~CSTR();
bool operator ==(const CSTR & rhs);
private:
unsigned int size;
char *elems;
};
============================
CSTR::CSTR() {
size = 0;
elems = new char [0];
}
CSTR::CSTR(unsigned int n) {
if (n > 0) {
size = n;
elems = new char [size];
}
else {
size = 0;
elems = new char [0];
}
}
CSTR::~CSTR() {
delete [] elems;
}
bool CSTR::operator ==(const CSTR & rhs) { //<< Always returns true
return (strcmp(elems, rhs.elems) == 0);
}
===========================================
class CSTR2 {
public:
CSTR2();
CSTR2(unsigned int n);
~CSTR2();
char * getCstrPtr() const;
private:
unsigned int size;
char *elems;
};
bool operator ==(const CSTR2 & CSTR2_1, const CSTR2 & CSTR2_2);
========================================
CSTR2::CSTR2() {
size = 0;
elems = new char [0];
}
CSTR2::CSTR2(unsigned int n) {
if (n > 0) {
size = n;
elems = new char [size];
}
else {
size = 0;
elems = new char [0];
}
}
CSTR2::~CSTR2() {
delete [] elems;
}
char * CSTR2::getCstrPtr() const {
return elems;
}
bool operator ==(const CSTR2 & CSTR2_1, const CSTR2 & CSTR2_2) { //<< Always returns true
return (strcmp(CSTR2_1.getCstrPtr(), CSTR2_2.getCstrPtr()) == 0);
}
這是什麼?你正在比較一些未初始化的數組並期待有意義的結果?有趣的是,您感覺需要在'CSTR'構造函數中分別處理'n == 0'的情況,它與'n> 0'的情況完全相同。你的班級不遵循三項規則。使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)並停止嘗試無故重新發明輪子。 – Praetorian
你看到的行爲是你期望的,如果代碼是正確的。但是,比較運算符不檢查長度,構造函數不初始化原始內存,因此代碼不正確。第一點,你看到了你應該期待的事情,本身就足以使問題無法回答。 –
相信我,我絕對不會試圖重新發明輪子。這是針對我們正在構建的HW分配的,迄今唯一的信息是爲數組分配內存,然後重載等效運算符。當我還沒有建立數據時,我一直在試圖弄清楚我應該測試什麼樣的等效性。到目前爲止,這個課程中最悲慘的部分是所有人都說過,所有人都會用cstrings做所有這些事情,我永遠不會使用它們。 – Victor