0

我正在使用一個程序,但無法理解在涉及類時處理指針的情況。我知道我必須使用new爲指針分配內存,並且在沒有使用類的時候可以使用它。我找不到一個簡單的教程來解釋如何執行此特定任務。有人能給我一些幫助嗎?這是我迄今爲止所做的相關片段,但它是輸出隨機字符:在類構造函數中爲指針分配內存

"Hangman.c" 
{ 

class Hangman 
{ 
public: 
... 
char* remainingLetters(); 
Hangman() 
{ 
    char* remaining=new char[26]; 
} 
~Hangman(); 

private: 
char* remaining; 
} 

"Hangman.cpp" 
{ 

... 
char* Hangman::remainingLetters() 
{ 
...does task to find remaining letters; 

return remaining; 
} 

    ostream& operator<< (ostream &out, Hangman &game) 
    { 
    out << "Letters remaining are: " << game.remaining <<endl 

    return out; 
    } 
} 

"main.cpp" 
{ 
... 
cout << game; 
... 
} 
+0

你不應該真的在C++中使用指針或'new',**尤其是**,如果你是初學者。它們是圖書館開發人員的小衆專家主題。 – 2012-04-12 11:43:03

+0

與不使用指針的主題一起,爲什麼不只是將成員變量聲明爲數組?即'char remaining [26];'那麼你不必擔心內存泄漏等問題,就像你忘記釋放析構函數中的內存一樣。 – 2012-04-12 11:45:00

+0

@JoachimPileborg每次調用函數時都需要返回一個數組,如果我沒有記錯的話,在C++中無法完成。這就是我試圖使用指針的原因。在這種情況下可以得到一個數組輸出嗎? – adohertyd 2012-04-12 11:46:39

回答

5

您未初始化您的成員。你應該有:

Hangman() 
{ 
    remaining=new char[26]; 
} 

您的版本:

Hangman() 
{ 
    char* remaining=new char[26]; 
} 

初始化稱爲remaining一個局部變量,其範圍是構造函數。

你應該delete[]內存在析構函數和實現複製構造函數和賦值運算符。

+0

*「實現複製構造函數**或**賦值運算符」*不!它應該是*「實現複製構造函數**和**賦值運算符」* – 2012-04-12 11:48:14

+0

@明顯錯字。 – 2012-04-12 11:48:59

+0

這是正確的答案。儘管如此,仍然沒有代碼工作。必須做更多的閱讀這個話題。感謝輸入 – adohertyd 2012-04-12 12:17:43

2
Hangman() 
{ 
    char* remaining=new char[26]; 
} 

在構造函數中,要初始化一個局部變量而不是類成員。此外,每個new/new[]應分別與delete/delete[]關聯以避免內存泄漏。而不是自己管理內存,而是使用智能指針

+1

或者一個'std :: string'。 – 2012-04-12 11:52:43

1

幾點非常重要:

  • 你需要使用new []在構造函數中的指針成員分配內存。
  • 您需要在析構函數中使用delete []釋放內存。
  • 您需要遵循三條規則

此外,請注意,在與您的班級成員remaining同名的構造函數中創建一個本地指針至多是ambigiuos,您應該適當地重命名它。

3

如果使用C++字符串而不是C風格的char數組,則大多數問題都會消失。

class Hangman 
{ 
public: 
    std::string remainingLetters(); 

    Hangman() { } 

private: 
    std::string remaining; 
}; 

「Hangman.cpp」

std::string Hangman::remainingLetters() 
{ 
    // ...does task to find remaining letters; 
    return remaining; 
} 
1

一側的方面是,通過執行

remaining=new char[26]; 

要爲25個字母(+一個0字節)預留空間,這是可能不是你想要的...

Regards

Andreas