Форум программистов, компьютерный форум CyberForum.ru

Error C2065: необъявленный идентификатор - C++

Восстановить пароль Регистрация
 
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 09:11     Error C2065: необъявленный идентификатор #1
В учебнике пишут, что если оператор new не может выделить память для нового объекта, он возвратит нулевой указатель, который содержит значение 0. Поскольку ссылка не может быть нулевой, то инициализировать ссылку на эту область памяти нельзя до тех пор, пока не будет установлено, что она не нулевая. В следующем примере показано, как это сделать:

C++
1
2
3
int *pInt = new int;
if (pInt != NULL)
   int &rInt = *pInt;

я сделал, как сказано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int* pInt = new int;
    if (pInt != NULL)
        int& rInt = *pInt;
    
    *pInt = 67;
 
    cout << *pInt << endl;
    cout << rInt  << endl;
        
    char response; std::cin >> response; // для задержки экрана
                    
    return 0;     
}
компилятор пометил строку 13:
error C2065: rInt: необъявленный идентификатор

но если закоментировать строку 7, то всё работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int* pInt = new int;
//  if (pInt != NULL)
        int& rInt = *pInt;
    
    *pInt = 67;
 
    cout << *pInt << endl;
    cout << rInt  << endl;
        
    char response; std::cin >> response; // для задержки экрана
                    
    return 0;     
}
Может в учебнике опечатка? Почему способ автора ведёт к ошибке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
08.07.2014, 09:19     Error C2065: необъявленный идентификатор #2
Первое - учебник безбожно устарел. Ещё с прошлого века оператор new изменил поведение и всегда возвращает ненулевой указатель на успешно выделенный блок памяти. В случае неудачи он выбрасывает исключение.
Второе - в сообщении об ошибке явно указано на путаницу в именах (rInt вместо pInt).
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 09:38     Error C2065: необъявленный идентификатор #3
Цитата Сообщение от lest_ Посмотреть сообщение
В следующем примере показано, как это сделать:
пример глупый, неправильный и вредный
Цитата Сообщение от lest_ Посмотреть сообщение
if (pInt != NULL)
int &rInt = *pInt;
во первых
rInt это ссылка
во вторых он определяется внутри if
если переписать пример то это явно видно
C++
1
2
3
4
if (pInt != NULL)
 {
   int &rInt = *pInt;
 }
следовательно вне блока его не видно
о чем компилятор честно предупреждает
Цитата Сообщение от lest_ Посмотреть сообщение
error C2065: rInt: необъявленный идентификатор
Цитата Сообщение от lest_ Посмотреть сообщение
но если закоментировать строку 7,
тогда rInt объявлен уже в main

Добавлено через 58 секунд
третье
где delete????
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
08.07.2014, 09:43     Error C2065: необъявленный идентификатор #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
всегда возвращает ненулевой указатель
не считая случаев nothrow
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 11:59  [ТС]     Error C2065: необъявленный идентификатор #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
оператор new изменил поведение и всегда возвращает ненулевой указатель на успешно выделенный блок памяти. В случае неудачи он выбрасывает исключение.
а оператор new возвращает именно указатель, или адрес области памяти?

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
во вторых он определяется внутри if
если переписать пример то это явно видно
C++
1
2
3
4
if (pInt != NULL)
 {
 int &rInt = *pInt;
 }
следовательно вне блока его не видно
о чем компилятор честно предупреждает
а как правильно? такой вариант верный?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    int* pInt = new int; // pInt - указатель
    int& rInt = *pInt;   // rInt - ссылка
    
    *pInt = 67;
    cout << *pInt << endl;
    cout << rInt  << endl;
 
    rInt = 2;
    cout << *pInt << endl;
    cout << rInt  << endl;
 
    delete pInt;
    pInt = 0;
        
    char response; std::cin >> response; // для задержки экрана
                    
    return 0;     
}
Компилируется. И оператор delete я добавил.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 12:01     Error C2065: необъявленный идентификатор #6
Цитата Сообщение от lest_ Посмотреть сообщение
именно указатель, или адрес области памяти?
а это не одно и то же ?)
Цитата Сообщение от lest_ Посмотреть сообщение
Компилируется. И оператор delete я добавил.
ну вот и правильно
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 12:03     Error C2065: необъявленный идентификатор #7
Цитата Сообщение от lest_ Посмотреть сообщение
а оператор new возвращает именно указатель,
да
Цитата Сообщение от lest_ Посмотреть сообщение
или адрес области памяти?
это одно и тоже

т.е выделил участок памяти
и вернул адрес на этот участок, но адрес то это и есть указатель
он говорит(указывает) пойди по такому то адресу и сделай то-то и то-то

а вот ссылка это грубо говоря разыменованный указатель

Добавлено через 1 минуту
Цитата Сообщение от lest_ Посмотреть сообщение
такой вариант верный?:
да
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 12:03     Error C2065: необъявленный идентификатор #8
Цитата Сообщение от ValeryS Посмотреть сообщение
говоря разыменованный указатель
даже грубо говоря это не так
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 12:04     Error C2065: необъявленный идентификатор #9
Цитата Сообщение от aLarman Посмотреть сообщение
даже грубо говоря это не так
А как?
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 12:04  [ТС]     Error C2065: необъявленный идентификатор #10
Цитата Сообщение от aLarman Посмотреть сообщение
а это не одно и то же ?)
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес. значит адрес и указатель это не совсем одно и то же. просто почему то в разных книгах терминология немного отличается. это запутывает
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 12:18     Error C2065: необъявленный идентификатор #11
Цитата Сообщение от lest_ Посмотреть сообщение
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес.
ну да
Цитата Сообщение от lest_ Посмотреть сообщение
значит адрес и указатель это не совсем одно и то же
ну раз пошли такие тонкости

адрес это адрес
улица Главная дом 1
а вот поле "куда" на конверте это указатель
туда ты вписываешь адрес(инициализируешь,присваиваешь)

если не написал адрес то указатель не инициализирован указывает в никуда

значит
C++
1
int* pInt = new int;
можно расшифровать так
new выделяет память под один int
и возвращает адрес выделенного участка памяти
объявляется переменная типа "указатель на int" и инициализируется адресом который вернул new
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 13:08     Error C2065: необъявленный идентификатор #12
Цитата Сообщение от ValeryS Посмотреть сообщение
А как?
а так, это альтернативный идентификатор для созданного объекта

т.е
C++
1
2
int x = 5;
int & g = x;//тут копировние объекта Х не происходит
так же можно так

C++
1
2
3
4
int x = 5;
int * p = &x;
int & g = *p;
//int & g = x;

а можно сломать систему
C++
1
2
3
4
5
6
int * p = new int;
*p = 10;
int & r = *p;
cout<<r<<endl;
delete p;
cout << r << endl//undefined behаvior потому что объект куда ссылается эта ссылка уже удален
и еще великая ошибка

C++
1
2
3
4
5
int & func()
{
int x = 10;
return x;
}//undefined behavior, после выхода из ф-ции временный объект уничтожился
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 14:33     Error C2065: необъявленный идентификатор #13
Цитата Сообщение от aLarman Посмотреть сообщение
а так, это альтернативный идентификатор для созданного объекта
ну а как он реализован?

и чем это будет отличатся от
C++
1
2
3
int x = 5;
int* g = &x;
*g=7;
*g разыменованная ссылка

Цитата Сообщение от aLarman Посмотреть сообщение
undefined behavior, после выхода из ф-ции временный объект уничтожился
ты это точно знаешь?
"объект не существует" вот так правильней
т.е утеряны с ним связи, но содержание его может не изменится, а может изменится
так скажем неопределенное поведение, что у тебя и указано
так же как в файловой системе при удалении файла, содержимое файла остается, удаляются ссылки на файл
но при определенной сноровке можно достать содержимое, правда результат никто не гарантировал

Добавлено через 32 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
*g разыменованная ссылка
погнал ведь я
разумеется правильно так
*g разыменованный указатель
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 15:35     Error C2065: необъявленный идентификатор #14
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
я не разработчик компилятора, но там нечто приближенное к указателю) толкьо типо безопасное
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
08.07.2014, 19:36     Error C2065: необъявленный идентификатор #15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
Ссылка - высокоуровневая концепция. Она может быть реализована, как ты говоришь, через разыменованный указатель. А может быть компилятор подставит сразу обращение к изначальной переменной. В этом случае это будет лишь псевдонимом, эквивалентным именем для существующей переменной и никаких указателей в реализации не будет. Иными словами, реализация зависит от конкретной ситуации. Я где-то здесь раньше приводил пример асмокода для разных ситуаций.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
08.07.2014, 19:40     Error C2065: необъявленный идентификатор #16
DrOffset, ну так я и не спорю
я же сказал "Грубо говоря"
так проще объяснить, по крайней мере для меня
но кстати не встречал реализацию без указателя, хотя дезассемблировал не мало
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 19:49     Error C2065: необъявленный идентификатор
Еще ссылки по теме:

Error C2065: _winmajor: необъявленный идентификатор C++
C++ Error C2065: xlineMAX: необъявленный идентификатор
C++ Error C2065: col_gray: необъявленный идентификатор

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
08.07.2014, 19:49     Error C2065: необъявленный идентификатор
  #17

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
но кстати не встречал реализацию без указателя
Я где-то тут приводил именно такой пример. Лень только искать

Yandex
Объявления
08.07.2014, 19:49     Error C2065: необъявленный идентификатор
Ответ Создать тему
Опции темы

Текущее время: 18:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru