Я играл с указателями и динамической памятью, пытаясь выучить 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;
}
Есть идеи? Заранее спасибо за помощь.
У вас есть указатель ageP
который указывает на память, выделенную этим вызовом: ageP = new int;
Вы можете получить доступ к этой памяти, разыменовав указатель (т. Е. Используя оператор разыменования: *ageP
):
MEMORY
| |
|--------|
| ageP | - - -
|--------| |
| ... | |
|--------| |
| *ageP | < - -
|--------|
| |
И тогда это так же, как вы работали бы с переменной типа int
, так до того, когда вы работали с переменной типа int
как это:
int age;
cin >> age;
теперь это станет:
int *ageP = new int;
cin >> *ageP;
Джон по сути прав, что ваша проблема заключается в предоставлении указателя, где ожидается ссылка.
Однако, поскольку вы пытаетесь узнать о динамическом размещении, использование автоматической переменной не является хорошим решением. Вместо этого вы можете создать ссылку из указателя, используя *
оператор разыменования.
int* ageP = new (nothrow) int;
std::cout << "What is your age?" << std::endl;
std::cin >> *ageP;
delete ageP;
Проблема в том, что вам нужна ссылка на int, а не на int *. Например
int ageP;
cin >> ageP;
Таким образом, удаление также не требуется, так как вы не будете использовать указатель.
Надеюсь, поможет.