Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Обьект в try

02.06.2015, 13:53. Показов 1880. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня !

Заметил одну неприятную вещь.

Если обьект выходит за область try ограниченную фигурными скобками - то он исчезает.

Обьект создан в try.

________________

И еще одна неприятность .

x области try скрывает x main().

как получить из области try доступ к x main() ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
 
{
 
      int x=777;
 
 try
 
{
     int x=7;
 
}
 
}
Заранее спасибо !
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2015, 13:53
Ответы с готовыми решениями:

Обьект в динамике
Всем привет ! Скажите пожалуйста , есть ли необходимость перем. х класса Miva ложить в динамическую память если обьект класса...

Невидимый обьект
Всем доброго дня ! Играясь с С++ обнаружил такое явление, что обьект можно создать невидимым Ca(); Как теперь можно использовать...

Вывести обьект из контруктора
Описание "В языке C++ оператор typeid возвращает ссылку на объект type_info, описывающий тип объекта, к которому принадлежит оператор...

32
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 14:10
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
как получить из области try доступ к x main() ?
Например так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int x = 1;
 
int main()
{
    int x = 2;
    int & r = x;
    {
        int x = 3;
        std::cout << ::x << std::endl;  // 1
        std::cout << r << std::endl;    // 2
        std::cout << x << std::endl;    // 3
    }
    return 0;
}
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.06.2015, 14:11
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Прочитайте про "области видимости переменных".

Цитата Сообщение от RAFA91 Посмотреть сообщение
Если обьект выходит за область try ограниченную фигурными скобками - то он исчезает.
Да. Это как раз и есть смысл области.

Цитата Сообщение от RAFA91 Посмотреть сообщение
как получить из области try доступ к x main() ?
Не объявлять там новый объект, а работать со старым:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
 
{
 
      int x=777;
 
 try
 
{
     /*int*/ x=7;
 
}
 
}
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 14:26  [ТС]
область

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
 
{
 
    try
 
{
     
 
}
 
}
аналогична области
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
 
{
 
  
 
{
     
 
}
 
}
без ключевого слова try ?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.06.2015, 14:31
Ога.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 14:31
Область видимости - да.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 14:34  [ТС]
а как на счет catch ?

C++
1
2
3
4
5
catch (int x)
 
    {
        
    }
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 14:38
Цитата Сообщение от RAFA91 Посмотреть сообщение
а как на счет catch ?
У него своя область видимости.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 14:57  [ТС]
спасибо теперь понял.

кстати заметил еще один косячок работы искл. ситуаций.

к примеру есть такой код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void dasa()
 
{
     cout<<"\nПривет Маня!!!\n";
 
throw 0;
 
cout<<"\nПривет Катя!!!\n";
 
}
 
int main()
 
{
 
  try
 
{
 
cout<<"\nПривет Таня!!!\n";
 
dasa();
 
cout<<"\nПривет Маша!!!\n";
 
}
 
catch(int x)
 
{
 
cout<<"\nПривет .Юля!!!\n";
 
}
 
cout<<"\nКонец!!!\n";
 
return 0;
 
}

на экран выводится

Привет Таня!!!
Привет Маня!!!
Привет .Юля!!!
Конец!!!

почему после окончания выполнения catch(int x) {}

не продолжается выполнение void dasa(), а потом возврат в try {} ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 15:02
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
почему после окончания выполнения catch(int x) {}
не продолжается выполнение void dasa(), а потом возврат в try {} ?
Потому что исключения так не работают. Управление не должно возвращаться в место, где был throw.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 15:22  [ТС]
тоесть throw перебрасывает в область catch и очищает область try ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 15:30
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Можно и так сказать, смотря что ты имеешь в виду под "очищать".
Об автоматических переменных, расположенные в стеке, можно не беспокоится.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.06.2015, 15:32
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от RAFA91 Посмотреть сообщение
и очищает область try ?
Любая область, из которой выходят, очищается.
А throw сигнализирует о том, что что-то пошло не так и программа не может дальше выполняться по своему задуманному алгоритму.
Область catch придумана не затем, чтобы с помощью нее реализовывать логику программы, а затем, чтобы в экстренных случаях программа не закрылась и не потерялись данные.
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 15:44  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Об автоматических переменных, расположенные в стеке, можно не беспокоится.
к примеру в try {} есть переменная х.

из try {} вызывается какая-то функция sasa()

как я понимаю переменная х пошла в стек.

потом в sasa() встретили throw.

Теперь переменная х уничтожается из стека?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 15:52
Цитата Сообщение от RAFA91 Посмотреть сообщение
Теперь переменная х уничтожается из стека?
Сама переменная может и останется в стеке, но в будущем будет перезаписана другим значением. В общем, о ней можно смело забыть.
1
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
02.06.2015, 16:01
Цитата Сообщение от RAFA91 Посмотреть сообщение
тоесть throw перебрасывает в область catch и очищает область try ?
throw можно рассматривать как многоуровненый return
1
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
02.06.2015, 17:35  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
о ней можно смело забыть.
так зачем мне утечка памяти (((?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 17:38
Цитата Сообщение от RAFA91 Посмотреть сообщение
так зачем мне утечка памяти (((?
Так её не будет.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
03.06.2015, 16:54  [ТС]
Благодарю всех за помощь !!!

Добавлено через 3 часа 7 минут
Очень интересный косячек меня настиг.

создаю обьект Array intArray(0);

в классе Array есть конструктор

C++
1
2
3
4
5
6
7
8
9
Array :: Array(int size) :
 
itsSize(size)
 
{
    printf("\nKONSTRUKTOR %p \n",this);
 
    if(size == 0) throw xZero (); 
}
на экран получаю сообщение о том что мы в теле конструктора.

далее из тела конструктора идем на catch (Array :: xZero)

Скажите пожалуйста , почему я не получаю сообщение от деструктора ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class Array
 
{
 
public:
 
    Array(int itsSize);
    
    ~Array() {printf("\nDESTRUKTOR %p \n",this); }
 
    int GetitsSize() const {return itsSize;}
    
    class xZero {};
    
    private:
        
    int itsSize;
};
 
Array :: Array(int size) :
 
itsSize(size)
 
{
    printf("\nKONSTRUKTOR %p \n",this);
 
    if(size == 0) throw xZero (); 
 
    
}
 
int main()
 
{
 
    try
 
    {
 
    Array intArray(0);
    
    printf("\nintArray =  %p \n",&intArray);
 
    printf("\n*** %d \n",intArray.GetitsSize());
    
    }
    
    catch (Array :: xZero)
 
    {
        cout<<"error!!!"<<endl; 
    }
 
    return 0;
}
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
03.06.2015, 16:56  [ТС]
---
Миниатюры
Обьект в  try  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.06.2015, 16:56
Помогаю со студенческими работами здесь

Передать в конструктор обьект
Здравствуйте, такой вопрос, у меня есть класс , в котором есть связной список, и мне нужно при создании добавить этот же обьект в связной...

Как вывести обьект с cout ?
Как вывести обьект с помощю cout ?

Абстрактные классы. Обьект в строку
Всем доброго вечера, существует следующяя ситуация.. Есть абстрактный класс в котором вирутальная функция,она должна преобразовывать...

Класс, обьект, имя, enum..
Помогите написать программу, пожалуйста! ( Visual studio 2005, 2008 C++) Задача: Создать класс &quot;товар&quot;: название, наличие...

Передача ссылки на обьект класса в функцию
Определен класс в хэддере: class List{ public: //... void Add(const List *list); //... Метод Add:


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru