работа с динамически выделяемой памятью (указатель)

Я играл с указателями и динамической памятью, пытаясь выучить C ++, и продолжаю получать эту ошибку при компиляции.

error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)

Мой код выглядит следующим образом:

int * ageP;
ageP = new (nothrow) int;

if (ageP == 0)
{
cout << "Error: memory could not be allocated";
}
else
{
cout<<"What is your age?"<<endl;
cin>> ageP;                       <--this is the error line
youDoneIt(ageP);
delete ageP;
}

Есть идеи? Заранее спасибо за помощь.

1

Решение

У вас есть указатель ageP который указывает на память, выделенную этим вызовом: ageP = new int; Вы можете получить доступ к этой памяти, разыменовав указатель (т. Е. Используя оператор разыменования: *ageP):

  MEMORY
|        |
|--------|
|  ageP  | - - -
|--------|      |
|  ...   |      |
|--------|      |
| *ageP  | < - -
|--------|
|        |

И тогда это так же, как вы работали бы с переменной типа int, так до того, когда вы работали с переменной типа int как это:

int age;
cin >> age;

теперь это станет:

int *ageP = new int;
cin >> *ageP;
6

Другие решения

Джон по сути прав, что ваша проблема заключается в предоставлении указателя, где ожидается ссылка.

Однако, поскольку вы пытаетесь узнать о динамическом размещении, использование автоматической переменной не является хорошим решением. Вместо этого вы можете создать ссылку из указателя, используя * оператор разыменования.

int* ageP = new (nothrow) int;
std::cout << "What is your age?" << std::endl;
std::cin >> *ageP;
delete ageP;
2

Проблема в том, что вам нужна ссылка на int, а не на int *. Например

int ageP;
cin >> ageP;

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

Надеюсь, поможет.

2
По вопросам рекламы [email protected]