Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
lest_
0 / 0 / 7
Регистрация: 28.11.2013
Сообщений: 94
#1

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

08.07.2014, 09:11. Просмотров 1059. Ответов 16
Метки нет (Все метки)

В учебнике пишут, что если оператор 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;     
}
Может в учебнике опечатка? Почему способ автора ведёт к ошибке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2014, 09:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Error C2065: необъявленный идентификатор (C++):

error C2065: wmId: необъявленный идентификатор
Всем привет) Вот выдает 3 ошибки.... Помогите пож, спасибо заранее за ваши...

error C2065: eof: необъявленный идентификатор
#include &quot;StdAfx.h&quot; int getline(char s, int lim) { int c,i; for(i=0;...

Error C2065: NULL: необъявленный идентификатор
#ifndef __MULTIMAP_H__ #define __MULTIMAP_H__ template &lt;class T, class...

Страуструп: error C2065: i–1: необъявленный идентификатор
Выполняю код по книге Стауструпа, в Visual C++ 2010. При компиляции выдается...

error C2065: nomer: необъявленный идентификатор
Помогите пожалуйста разобраться, ниче не могу понять. #include &lt;iostream&gt;...

Error C2065: col_gray: необъявленный идентификатор
#include &quot;stdafx.h&quot; #include &quot;lab01.h&quot; lab07::lab07() : m_pBits( 0 ) { ...

16
Nick Alte
Эксперт С++
1646 / 1018 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
08.07.2014, 09:19 #2
Первое - учебник безбожно устарел. Ещё с прошлого века оператор new изменил поведение и всегда возвращает ненулевой указатель на успешно выделенный блок памяти. В случае неудачи он выбрасывает исключение.
Второе - в сообщении об ошибке явно указано на путаницу в именах (rInt вместо pInt).
2
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 09:38 #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????
1
Кудаив
409 / 408 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
08.07.2014, 09:43 #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
всегда возвращает ненулевой указатель
не считая случаев nothrow
1
lest_
0 / 0 / 7
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 11:59  [ТС] #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 я добавил.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.07.2014, 12:01 #6
Цитата Сообщение от lest_ Посмотреть сообщение
именно указатель, или адрес области памяти?
а это не одно и то же ?)
Цитата Сообщение от lest_ Посмотреть сообщение
Компилируется. И оператор delete я добавил.
ну вот и правильно
1
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 12:03 #7
Цитата Сообщение от lest_ Посмотреть сообщение
а оператор new возвращает именно указатель,
да
Цитата Сообщение от lest_ Посмотреть сообщение
или адрес области памяти?
это одно и тоже

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

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

Добавлено через 1 минуту
Цитата Сообщение от lest_ Посмотреть сообщение
такой вариант верный?:
да
1
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.07.2014, 12:03 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
говоря разыменованный указатель
даже грубо говоря это не так
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 12:04 #9
Цитата Сообщение от aLarman Посмотреть сообщение
даже грубо говоря это не так
А как?
0
lest_
0 / 0 / 7
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 12:04  [ТС] #10
Цитата Сообщение от aLarman Посмотреть сообщение
а это не одно и то же ?)
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес. значит адрес и указатель это не совсем одно и то же. просто почему то в разных книгах терминология немного отличается. это запутывает
0
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 12:18 #11
Цитата Сообщение от lest_ Посмотреть сообщение
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес.
ну да
Цитата Сообщение от lest_ Посмотреть сообщение
значит адрес и указатель это не совсем одно и то же
ну раз пошли такие тонкости

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

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

значит
C++
1
int* pInt = new int;
можно расшифровать так
new выделяет память под один int
и возвращает адрес выделенного участка памяти
объявляется переменная типа "указатель на int" и инициализируется адресом который вернул new
1
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.07.2014, 13:08 #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, после выхода из ф-ции временный объект уничтожился
1
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 14:33 #13
Цитата Сообщение от aLarman Посмотреть сообщение
а так, это альтернативный идентификатор для созданного объекта
ну а как он реализован?

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

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

Добавлено через 32 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
*g разыменованная ссылка
погнал ведь я
разумеется правильно так
*g разыменованный указатель
1
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.07.2014, 15:35 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
я не разработчик компилятора, но там нечто приближенное к указателю) толкьо типо безопасное
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
08.07.2014, 19:36 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
Ссылка - высокоуровневая концепция. Она может быть реализована, как ты говоришь, через разыменованный указатель. А может быть компилятор подставит сразу обращение к изначальной переменной. В этом случае это будет лишь псевдонимом, эквивалентным именем для существующей переменной и никаких указателей в реализации не будет. Иными словами, реализация зависит от конкретной ситуации. Я где-то здесь раньше приводил пример асмокода для разных ситуаций.
1
ValeryS
Модератор
7130 / 5398 / 669
Регистрация: 14.02.2011
Сообщений: 18,220
08.07.2014, 19:40 #16
DrOffset, ну так я и не спорю
я же сказал "Грубо говоря"
так проще объяснить, по крайней мере для меня
но кстати не встречал реализацию без указателя, хотя дезассемблировал не мало
0
DrOffset
08.07.2014, 19:49     Error C2065: необъявленный идентификатор
  #17

Не по теме:

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

0
08.07.2014, 19:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 19:49
Привет! Вот еще темы с ответами:

Error C2065: cout: необъявленный идентификатор
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() { int...

Error C2065: cout: необъявленный идентификатор
видаёт мне такую ошибку: 1&gt;c:\documents and...

error C2065: CIRCLE: необъявленный идентификатор
Почему не видно CIRCLE? error C2065: CIRCLE: необъявленный идентификатор ...

Error C2065: xlineMAX: необъявленный идентификатор
Вид исходного файла: INLINE : 233 XLINE : 202 668417,50000 ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru