2010-09-14 100 views
0

下面的代碼不起作用:問題指針和構造

class String{ 
public: 
    char* str; 
    int* counter; 

    String(){ 
     str = NULL; 
     counter = new int; 
     *counter = 1; 
    }; 
    String(const char* str1){ 
     String(); 
     str = new char[strlen(str1)+1]; 
     strcpy(str, str1); 
    }; 


}; 

我已經與它的內部改變調用空構造和替換它,現在下面的代碼工作:

class String{ 
public: 
    char* str; 
    int* counter; 

    String(){ 
     str = NULL; 
     counter = new int; 
     *counter = 1; 
    }; 
    String(const char* str1){ 
     //String(); 
     str = new char[strlen(str1)+1]; 
     strcpy(str, str1); 
     counter = new int; 
     *counter = 1; 
    }; 

你可以請建議爲什麼嗎?

謝謝,李。

+2

您應該說明它是什麼,你考慮沒有工作,它是什麼,你認爲現在可能工作對你想要達到的目標給出理性。對於初學者來說,你應該使用'std :: string',因爲它已經工作了,從那裏開始......你提供泄漏內存的兩個實現,計數器不需要動態分配,通常是一個好主意成員暴露... – 2010-09-14 14:31:50

+0

你爲什麼要調用默認的構造函數,看起來沒有附加值? – 2010-09-14 14:32:36

回答

3

「不起作用」不是一個很好的問題描述。但你顯然試圖從另一個構造函數調用。這就是所謂的構造函數的委託,並沒有(尚未)被C++支持。

順便說一句,這樣的類應該得到一個用戶定義的副本構造函數,賦值運算符和析構函數。

+0

+1:用於複製ctor,賦值和析構函數 – 2010-09-14 14:43:04

2

在當前的C++中,構造函數不能相互調用。這就是所謂的「鏈接構造函數」,或者「委託構造函數」,並且由新的C++ 0x標準支持,但使用的語法與您正在使用的不同。

題外話,你爲什麼使用int指針指向計數器?

2

在我看來,你正試圖從同一個類的另一個構造函數調用構造函數,就像你在C#中一樣。不幸的是,你不能在C++中做到這一點(至少我沒有簡單的方法)。您需要有一個私有方法或複製代碼。

0
  • 爲什麼計數器是一個指針?

什麼不行?編譯錯誤?

大概在另一個內部調用構造函數在你的編譯器中不被很好的支持?

什麼平臺?

1

調用字符串();實際上會創建一個臨時對象,然後再將其扔掉。它不會調用其他構造函數。

1

調用'String();'將創建一個立即銷燬的String類型的未命名臨時對象。第二個代碼片段很好。

然而,你應該真的重新看你的班級成員。使用std :: string而不是原始字符指針。此外int *counter看起來不是很直觀

1

你被允許做這樣的事情:

class String{ 

public: 
    char* str; 
    int* counter; 

private: 
    void initialize() { 
     str = NULL; 
     counter = new int; 
     *counter = 1; 
    } 
public: 
    String(){ 
     initialize(); 
    }; 
    String(const char* str1){ 
     initialize(); 
     str = new char[strlen(str1)+1]; 
     strcpy(str, str1); 
    }; 


};