2014-07-18 34 views
-2

我有兩個類將創建一個動態分配的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); 
} 
+4

這是什麼?你正在比較一些未初始化的數組並期待有意義的結果?有趣的是,您感覺需要在'CSTR'構造函數中分別處理'n == 0'的情況,它與'n> 0'的情況完全相同。你的班級不遵循三項規則。使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)並停止嘗試無故重新發明輪子。 – Praetorian

+0

你看到的行爲是你期望的,如果代碼是正確的。但是,比較運算符不檢查長度,構造函數不初始化原始內存,因此代碼不正確。第一點,你看到了你應該期待的事情,本身就足以使問題無法回答。 –

+0

相信我,我絕對不會試圖重新發明輪子。這是針對我們正在構建的HW分配的,迄今唯一的信息是爲數組分配內存,然後重載等效運算符。當我還沒有建立數據時,我一直在試圖弄清楚我應該測試什麼樣的等效性。到目前爲止,這個課程中最悲慘的部分是所有人都說過,所有人都會用cstrings做所有這些事情,我永遠不會使用它們。 – Victor

回答

1

你還沒有初始化那些緩衝區的內容,你new編輯。它們可以包含任何東西。如果你分配的兩個緩衝區都以'\0'開頭,那麼strcmp確實會說它們是相等的(因爲它們都被認爲是零長度字符串)。

而且,我同意在禁衛軍的評論的一切,尤其是有關的三個規則。

+0

謝謝克里斯!這是我們將在週末進行的一項任務。到目前爲止,我所知道的只是創建我所擁有的,併爲每個班級重載等同運算符。我不確定strcmp是否應該返回0,否則當我不得不離開數組的大小時,strcmp應該返回0。 – Victor

+0

看到行爲的另一個可能的原因是代碼是正確的。我們可以看到它不是。但是最可能的解決方法不是初始化數組內容,而是具有相等比較檢查長度,因爲長度是明確表示的。 –

+0

@Alf:當然我同意首先檢查長度,但在那種情況下,我們不再處理「C」字符串。然後比較應該使用'memcmp'。 –