gpt4 book ai didi

c++ - c++中关于重载流运算符的几个问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:10 32 4
gpt4 key购买 nike

我正在开发一个刽子手程序,我想在每次猜测后向用户输出一个状态报告。当我使用类时,我需要使用“ friend ”关键字。我接受类和 friend 的概念,但是我正在努力在我的程序中正确地实现它。

主要问题是元音的数量没有被计算在内,用户可以尝试的字母数量也没有更新。每次都会显示完整的字母表。

我的程序代码很多,我不打算在这里发布所有代码。我遇到的问题是函数 remainingLetters();和 vowelCount()。我附上了相关的代码片段。这段代码显然不会编译。我只是希望有人能看到我遗漏的明显错误。

**Hangman.h:**
{
public:
...
int vowelCount()const; //to be implemented
char* remainingLetters()const;//to be implemented
friend ostream& operator<< (ostream &out, Hangman &game);

private:
...
int vowel_count;
char secretWord[MAXWORDLENGTH];
char* remaining_letters;
}

**hangman.cpp:**
{
...
int Hangman::vowelCount()const
{
int vowel_count = 0;
int i;
secretWord[i];

for(i=0; i<strlen(secretWord); i++)
{


if(secretWord[i]=='a'||secretWord[i]=='e'||secretWord[i]=='i'||secretWord[i]=='o'||secretWord[i]=='u')
{
vowel_count++;
}
}
return vowel_count;
}

char* Hangman::remainingLetters()const
{
char alphabet[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char *remaining_letters=new char[ALPHABETSIZE];

for(int i=0; i<strlen(secretWord); i++)
{
for(int j=0; j<ALPHABETSIZE; j++)
{
if(secretWord[i]!=alphabet[j])
{
remaining_letters[j]=alphabet[j];
}
}
}
return remaining_letters;
}

ostream& operator<< (ostream &out, Hangman &game)
{
out << "Number of guesses remaining is: " << game.numGuessesAllowed-game.numWrongGuesses << endl
<< "Number of incorrect guesses so far is: "<<game.numWrongGuesses <<endl
<< "Letters remaining are: "<<game.remaining_letters <<endl
<< "Hint: The secret word contains "<<game.vowel_count <<" vowels"<<endl;

return out;
}
}

**main.cpp**
{
...
cout << game;
...
return 0;
}

最佳答案

您需要调用函数 vowelCount()remainingLetters()用于计算相应的变量(以便您可以输出它们)。

此外,char *remaining_letters=new char[ALPHABETSIZE];将为字母分配内存并用 0 初始化每个位置——这也恰好是字符串终止值。因此,如果未设置第一个位置(字母 'a'),则 out<<game.remaining_letters不会输出任何东西

此外,函数 vowelCount()定义局部变量 vowel_count隐藏了类中的那个(成员变量),所以成员变量不会得到更新(除非你显式地将 vowelCount() 的返回值赋给那个成员变量)我建议你从 vowelCount() 中删除局部变量声明函数,它会使用成员变量,这是你需要的

上一段同样适用于成员变量remaining_letters

还有一件事:用 new 分配的内存不会自动释放,一旦你从函数调用返回,分配的内存就会丢失(因为没有办法再次访问它,但它仍然使用内存),除非你在函数返回时分配它。您需要对每个 new[] 进行配对用其对应的 delete[] 调用称呼。更好的是:在类的构造函数中分配内存,并在成员变量的析构函数中删除它

注意:此逻辑中还有另一个错误:

for(int i=0; i<strlen(secretWord); i++) 
{
for(int j=0; j<ALPHABETSIZE; j++)
{
if(secretWord[i]!=alphabet[j])
{
remaining_letters[j]=alphabet[j];
}
}
}

你循环遍历字母表,每次 secret 单词中的当前字母不匹配时,你分配给remaining_letters .每次都会发生这种分配,因为字母表中会有一个字母与当前的 secretWord 字母不匹配。

要解决此问题,您需要执行以下操作(注意循环的反转):

int secret_len = strlen(secretWord); // cache length, so we don't recalculate it
// every time: secretWord does not change
for(int j=0; j<ALPHABETSIZE; j++)
{
bool found = false; // assume the current ABC letter is not in secretWord
for(int i=0; i<secret_len; i++)
{
if(secretWord[i]!=alphabet[j])
{
found = true; // but it was
}
}
if (!found) // if it wasn't
{
remaining_letters[j]=alphabet[j];
}
}

关于c++ - c++中关于重载流运算符的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110925/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com