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;
...
}
4

5 に答える 5

5

メンバーを初期化していません。あなたが持っている必要があります:

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

あなたのバージョン:

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

remainingスコープがコンストラクターであるというローカル変数を初期化します。

またdelete[]、デストラクタにメモリを配置し、コピー コンストラクタと代入演算子を実装する必要があります。

于 2012-04-12T11:42:30.347 に答える
3

C スタイルの char 配列の代わりに C++ 文字列を使用すると、ほとんどの問題が解消されます。

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

    Hangman()  { } 

private:
    std::string   remaining; 
};

「ハングマン.cpp」

std::string Hangman::remainingLetters() 
{
    //  ...does task to find remaining letters;
   return remaining;  
} 
于 2012-04-12T11:58:26.310 に答える
2
Hangman()
{
  char* remaining=new char[26];
}

コンストラクターでは、ローカル変数を初期化していますが、クラス メンバーは初期化していません。また、メモリ リークを避けるために、everynew/new[]をそれぞれ関連付ける必要があります。delete/delete[]自分でメモリを管理する代わりに、代わりにスマート ポインターを使用します。

于 2012-04-12T11:43:02.847 に答える
1

いくつかの重要なポイント:

  • new []コンストラクターのポインターメンバーを使用してメモリを割り当てる必要があります。
  • delete []デストラクタで使用してメモリの割り当てを解除する必要があります。
  • 3 つのルールに従う必要があります。

また、コンストラクターでクラス メンバーと同じ名前のローカル ポインターを作成することremainingはせいぜいあいまいであり、適切に名前を変更する必要があることに注意してください。

于 2012-04-12T11:44:02.163 に答える
1

1つの側面は、それを行うことによって

remaining=new char[26];

25 文字 (+ 1 バイト) のスペースを予約していますが、これはおそらくあなたが望むものではありません...

よろしく

アンドレアス

于 2012-04-12T12:33:28.877 に答える