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

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

08.07.2014, 09:11. Показов 1861. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2014, 09:11
Ответы с готовыми решениями:

Error C2065: i: необъявленный идентификатор
Вроде все правильно и лупит ошибку кто что подскажет?! #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Error C2065: cout: необъявленный идентификатор
Доброго времени суток. Решил научиться программированию, по книге. Автор рассматривает...

Error C2065: lpConsoleTitle: необъявленный идентификатор
Как исправить? HWND hwnd; char Title; int iWidth =...

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

16
Эксперт С++
1667 / 1039 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2014, 09:19 2
Первое - учебник безбожно устарел. Ещё с прошлого века оператор new изменил поведение и всегда возвращает ненулевой указатель на успешно выделенный блок памяти. В случае неудачи он выбрасывает исключение.
Второе - в сообщении об ошибке явно указано на путаницу в именах (rInt вместо pInt).
2
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
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
416 / 415 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
08.07.2014, 09:43 4
Цитата Сообщение от Nick Alte Посмотреть сообщение
всегда возвращает ненулевой указатель
не считая случаев nothrow
1
0 / 0 / 0
Регистрация: 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
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
08.07.2014, 12:01 6
Цитата Сообщение от lest_ Посмотреть сообщение
именно указатель, или адрес области памяти?
а это не одно и то же ?)
Цитата Сообщение от lest_ Посмотреть сообщение
Компилируется. И оператор delete я добавил.
ну вот и правильно
1
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
08.07.2014, 12:03 7
Цитата Сообщение от lest_ Посмотреть сообщение
а оператор new возвращает именно указатель,
да
Цитата Сообщение от lest_ Посмотреть сообщение
или адрес области памяти?
это одно и тоже

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

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

Добавлено через 1 минуту
Цитата Сообщение от lest_ Посмотреть сообщение
такой вариант верный?:
да
1
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
08.07.2014, 12:03 8
Цитата Сообщение от ValeryS Посмотреть сообщение
говоря разыменованный указатель
даже грубо говоря это не так
0
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
08.07.2014, 12:04 9
Цитата Сообщение от aLarman Посмотреть сообщение
даже грубо говоря это не так
А как?
0
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
08.07.2014, 12:04  [ТС] 10
Цитата Сообщение от aLarman Посмотреть сообщение
а это не одно и то же ?)
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес. значит адрес и указатель это не совсем одно и то же. просто почему то в разных книгах терминология немного отличается. это запутывает
0
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
08.07.2014, 12:18 11
Цитата Сообщение от lest_ Посмотреть сообщение
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес.
ну да
Цитата Сообщение от lest_ Посмотреть сообщение
значит адрес и указатель это не совсем одно и то же
ну раз пошли такие тонкости

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

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

значит
C++
1
int* pInt = new int;
можно расшифровать так
new выделяет память под один int
и возвращает адрес выделенного участка памяти
объявляется переменная типа "указатель на int" и инициализируется адресом который вернул new
1
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
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
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
08.07.2014, 15:35 14
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
я не разработчик компилятора, но там нечто приближенное к указателю) толкьо типо безопасное
0
15247 / 8215 / 1992
Регистрация: 30.01.2014
Сообщений: 13,997
08.07.2014, 19:36 15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
Ссылка - высокоуровневая концепция. Она может быть реализована, как ты говоришь, через разыменованный указатель. А может быть компилятор подставит сразу обращение к изначальной переменной. В этом случае это будет лишь псевдонимом, эквивалентным именем для существующей переменной и никаких указателей в реализации не будет. Иными словами, реализация зависит от конкретной ситуации. Я где-то здесь раньше приводил пример асмокода для разных ситуаций.
1
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
08.07.2014, 19:40 16
DrOffset, ну так я и не спорю
я же сказал "Грубо говоря"
так проще объяснить, по крайней мере для меня
но кстати не встречал реализацию без указателя, хотя дезассемблировал не мало
0
DrOffset
08.07.2014, 19:49     Error C2065: необъявленный идентификатор
  #17

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2014, 19:49

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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


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

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

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