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