2014-02-25 47 views
0

設計一個字符串類構造函數的最佳方法是什麼?下面的構造函數肯定有問題:兩個指針指向一個對象,如果其中一個被破壞,另一個會導致致命錯誤。那麼,爲字符串類設計構造函數的最佳方法是什麼?設計一個字符串類構造函數C++

class CMyString{ 
    private: 
     char *pData; 
    public: 
     CMyString(char *_p=NULL):pData(_p){ 
    } 
     CMyString(CMyString &_str):pData((_str.pData){ 
    } 
} 
+1

所有我曾經設計了string對象有多個構造函數,允許用戶輸入不同的數據類型爲字符串。 – trumpetlicks

+0

由於你的類沒有析構函數,你的聲明顯然是錯誤的。 –

回答

1

分配空間和在複製的字符。

此外,我建議不允許pData爲空,因爲它使邏輯複雜化。相反,如果沒有給出初始值,請創建一個空字符串。

此外,不要忘記是const正確的。

CMyString(const char *_p = "") { 
    size_t len = strlen(_p); 
    pData = new char[len+1]; 
    strcpy(pData, _p); 
} 
CMyString(const CMyString& _str) { /* basically the same as above */ } 
+0

CMyString myStr(0); 將崩潰此 –

+0

我也不同意你關於pData爲空的聲明。用戶確實可以傳入未初始化的char * _p是非常現實的可能性,並且應該處理這種情況。它使邏輯複雜化,但編碼SAFE代碼時卻是必不可少的複雜因素。 – trumpetlicks

+0

@Alex傳入一個未終止的字符串也可能導致它崩潰。所以呢?你只是告訴你的用戶*不要這樣做。* – Brian

2

例如,您可以通過以下方式定義類。

class CMyString 
{ 
private: 
    char *pData; 

public: 
    CMyString(const char *_p = NULL) 
    { 
     if (_p == NULL) 
     { 
      pData = NULL; 
     } 
     else 
     { 
      pData = new char[ std::strlen(_p) + 1 ]; 
      std::strcpy(pData, _p); 
     } 
    } 

    CMyString(const CMyString &_str) 
    { 
     if (_str.pData == NULL) 
     { 
      pData = NULL; 
     } 
     else 
     { 
      pData = new char[ std::strlen(_str.pData) + 1 ]; 
      std::strcpy(pData, _str.pData); 
     } 
    } 

    explicit operator bool() const { return (pData != NULL); } 

    CMyString & operator =(const CMyString &); // do not forget to define 

    ~CMyString(); // do not forget to define 
}; 

,也可以定義拷貝構造函數如下方式

CMyString(const CMyString &_str) : CMyString(_str.pData) 
    { 
    } 
相關問題