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

На самом деле вы не должны использовать указатели или 'new' вообще в C++, ** особенно если вы новичок. Они являются нишевыми экспертными темами для разработчиков библиотек. –

+0

Идя по теме не используя указатели, почему бы просто не объявить переменную-член как массив? То есть 'char остается [26];' Тогда вам не нужно беспокоиться о таких вещах, как утечки памяти, например, если вы забудете освободить память в деструкторе. –

+0

@JoachimPileborg Мне нужно возвращать массив каждый раз, когда вызывается функция, которая не может быть выполнена на C++, если я правильно помню. Вот почему я пытаюсь использовать указатель. Можно ли получить массив в этом случае? – adohertyd

ответ

5

Вы не инициализируется вам член. Вы должны иметь:

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

Ваша версия:

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

инициализирует локальную переменную с именем remaining, областью действия которого является конструктор.

Также вы должны delete[] память в деструкторе и реализовать конструктор копирования и оператор присваивания.

+0

* «Реализовать конструктор копирования ** ИЛИ ** оператор присваивания» * Нет !, он должен быть * «Реализовать конструктор копирования ** И ** оператор присваивания» * –

+0

@ Очевидная опечатка. –

+0

Это правильный ответ. Тем не менее, пока не работает код. Должны сделать намного больше чтения по этой теме. Спасибо за ввод – adohertyd

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

В конструкторе вы инициализируете локальную переменную, но не член класса. Кроме того, каждый new/new[] должен быть связан с delete/delete[], чтобы избежать утечек памяти. Вместо управляющей памяти используйте вместо этого интеллектуальные указатели.

+1

Или 'std :: string'. –

1

Несколько важных моментов:

  • Вам нужно выделить память с помощью new [] к элементу указателя в конструкторе.
  • Вам необходимо освободить память, используя delete [] в деструкторе.
  • Вам необходимо следовать правилу Правило 3.

Кроме того, обратите внимание, что создает локальный указатель в конструкторе с таким же именем, как класс член remaining в лучшем случае ambigiuos и вы должны переименовать его соответствующим образом.

3

Большинство проблем уходит, если вы используете строку C++ вместо массива символов C.

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-байт), который вероятно, не то, что вы хотите ...

С уважением

Andreas

Смежные вопросы