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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
#1

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

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

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

error C2065: CIRCLE: необъявленный идентификатор - C++
Почему не видно CIRCLE? error C2065: CIRCLE: необъявленный идентификатор struct Shape { enum { CIRCLE, SQUARE, RECTANGLE }...

Error C2065: cout: необъявленный идентификатор - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() { int x, y, a, b; cout &lt;&lt; &quot;Insert x(int):\n&quot;; cin &gt;&gt;...

Error C2065: NULL: необъявленный идентификатор - C++
#ifndef __MULTIMAP_H__ #define __MULTIMAP_H__ template &lt;class T, class keyT&gt; struct mapstruct { keyT key; T info; ...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
08.07.2014, 09:19     Error C2065: необъявленный идентификатор #2
Первое - учебник безбожно устарел. Ещё с прошлого века оператор new изменил поведение и всегда возвращает ненулевой указатель на успешно выделенный блок памяти. В случае неудачи он выбрасывает исключение.
Второе - в сообщении об ошибке явно указано на путаницу в именах (rInt вместо pInt).
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
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,165
Завершенные тесты: 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
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 12:01     Error C2065: необъявленный идентификатор #6
Цитата Сообщение от lest_ Посмотреть сообщение
именно указатель, или адрес области памяти?
а это не одно и то же ?)
Цитата Сообщение от lest_ Посмотреть сообщение
Компилируется. И оператор delete я добавил.
ну вот и правильно
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
08.07.2014, 12:03     Error C2065: необъявленный идентификатор #7
Цитата Сообщение от lest_ Посмотреть сообщение
а оператор new возвращает именно указатель,
да
Цитата Сообщение от lest_ Посмотреть сообщение
или адрес области памяти?
это одно и тоже

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

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

Добавлено через 1 минуту
Цитата Сообщение от lest_ Посмотреть сообщение
такой вариант верный?:
да
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 12:03     Error C2065: необъявленный идентификатор #8
Цитата Сообщение от ValeryS Посмотреть сообщение
говоря разыменованный указатель
даже грубо говоря это не так
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
08.07.2014, 12:18     Error C2065: необъявленный идентификатор #11
Цитата Сообщение от lest_ Посмотреть сообщение
я не знаю. где то прочитал, что указатель это переменная, которая содержит адрес.
ну да
Цитата Сообщение от lest_ Посмотреть сообщение
значит адрес и указатель это не совсем одно и то же
ну раз пошли такие тонкости

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

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

значит
C++
1
int* pInt = new int;
можно расшифровать так
new выделяет память под один int
и возвращает адрес выделенного участка памяти
объявляется переменная типа "указатель на int" и инициализируется адресом который вернул new
aLarman
642 / 563 / 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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
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
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
08.07.2014, 15:35     Error C2065: необъявленный идентификатор #14
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
я не разработчик компилятора, но там нечто приближенное к указателю) толкьо типо безопасное
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
08.07.2014, 19:36     Error C2065: необъявленный идентификатор #15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а как он реализован?
Ссылка - высокоуровневая концепция. Она может быть реализована, как ты говоришь, через разыменованный указатель. А может быть компилятор подставит сразу обращение к изначальной переменной. В этом случае это будет лишь псевдонимом, эквивалентным именем для существующей переменной и никаких указателей в реализации не будет. Иными словами, реализация зависит от конкретной ситуации. Я где-то здесь раньше приводил пример асмокода для разных ситуаций.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
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: cout: необъявленный идентификатор - C++
видаёт мне такую ошибку: 1&gt;c:\documents and settings\администратор.home-8a34687735\мои документы\visual studio 2010\projects\lab 1.3\lab...

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

Error C2065: _winmajor: необъявленный идентификатор - C++
Помогите дописать! Наглядно продемонстрировать инициализацию переменных, совершаемую стартовым кодом, позволяет следующая программа....

error C2065: wmId: необъявленный идентификатор - C++
Всем привет) Вот выдает 3 ошибки.... Помогите пож, спасибо заранее за ваши ответы) Ошибки: 1&gt;c:\my documents\visual studio...

Найти причины и способы исправления ошибки "error C2065: необъявленный идентификатор" - C++
имеется f1.h typedef struct { int some; } tStruct; f2.h


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

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

Не по теме:

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

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

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