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

Обьект в try

02.06.2015, 13:53. Показов 1862. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru