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

исключения c++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как модернезировать программу http://www.cyberforum.ru/cpp-beginners/thread322625.html
Как можно модернезировать эту программу чтобы она понимала русские буквы ? #include<iostream> #include<ctype.h> using namespace std; int main () { char a; int b;
C++ в чем ошибка? я начал учить ф-ии.пока не все знаю,в книге так #include <stdio.h> #include <iostream.h> int main(int nNumberofArgs, char* pszArgs) { int sumSequence (void){ int accumulator; accumulator = 0;... http://www.cyberforum.ru/cpp-beginners/thread322609.html
Передача сообщений в окно C++
Есть прогрмка , написаная мной же с использованием MFC в которой имеется поле для ввода и кнопка. По нажатию кнопки из текстового поля считывается содержимое сравнивается с некоторой строкой...
C++ Непонятная ошибка компилятора Dev-Cpp
#include <cstdlib> #include <iostream> using namespace std; void s(int a) { cout<<a<<endl; } class matrix {public:
C++ Различия между двумя циклами http://www.cyberforum.ru/cpp-beginners/thread322567.html
объясните различия между двумя следующими циклами while #include <iostream> using namespace std; int main () { const char *cp="hello"; int cnt=0;
C++ Почему выводит неправильное ,длинное число? я новичок,учу по книге.там задано #include <stdio.h> #include <iostream.h> int main(int nNumberofArgs, char* pszArgs) { int accumulator; for (;;){ int value=0; cout << "vvedite cislo"; cin... подробнее

Показать сообщение отдельно
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612

исключения c++ - C++

19.06.2011, 17:47. Просмотров 2091. Ответов 11
Метки (Все метки)

Здраствуйте! Я тут приспособил код старого проекта чтобы побаловаться с исключениями. Перечитывал я тут недавно главу 14.6 из Страуструпа Язык прграммирования с++. Глава про спецификацию исключений. Он пишет, что если например
Cone max_v(const vector<Cone> &cones) throw(int);
может сгенерировать интовые исключения и если функции нарушит свои обязательства, то вызовется unexpected и так далее. Ну по крайней мере я так понял

Вот собственно код
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// project4Sale.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <vector>
#include <iostream>
 
 
#include "circle.h"
#include "cone.h"
 
using namespace std;
using geometry::Circle;
using geometry::Cone;
 
Cone max_v(const vector<Cone> &cones) throw(int);
double average_s(const vector<Circle> &circles);
 
int _tmain(int argc, _TCHAR* argv[])
{
    size_t              N = 5,  //Circles
                        M = 5;  //Conuses
    
    
 
    vector<Cone> vct;
 
    vct.push_back(Cone(9,76));
    vct.push_back(Cone(2,4));
    vct.push_back(Cone(5,6));
    
 
    try
    {
        try
        {
            max_v(vct).print();
        }
        catch (Cone &cn)
        {
            cn.setRadius(12);
            cn.setHeight(12);
            cn.print();
            throw;
        }
        catch (Circle cr)
        {
            cr.print();
        }
        catch (int)
        {
            cout << "hi";
        }
    }
    catch (Cone cn)
    {
        cn.print();
    }
 
    return 0;
}
 
 
 
 
Cone max_v(const vector<Cone> &cones)
{
    Cone max_tmp(0, 0);
    for (vector<Cone>::const_iterator it = cones.begin(); it != cones.end(); it++) 
    {
        double tmp = max_tmp.v();
        double tmp2 = it->v();
        if ( tmp2 > tmp )
        {
            max_tmp = *it;
        }
        else
        {
            
            throw Circle(5);
        }
    }
 
    return max_tmp;
}
 
double average_s(const vector<Circle> &circles)
{
    double tmp = 0;
 
    for (vector<Circle>::const_iterator it = circles.begin(); it != circles.end(); it++) 
    {
        tmp += it->s();
    }
 
    return ( tmp / circles.size() );
}
всё читать не надо, интересны только строки 16 и 80. В 80-ой строке функция ведь "нарушает взятые на себя обязательства" но никаких unexpected\terminate\abort не происходит, как ни в чём не бывало обрабатывает исключение и работает дальше. Почему? И вобще я щас ещё попробывал throw() то есть функция вобще никаких исключений не должна генерировать, нормально работает

Добавлено через 6 минут
хотя нет, при throw() в конце самом вылетает с ошибкой Необработанное исключение в "0x6290797f (msvcp90d.dll)" в "project4Sale.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
но разве так происходит этот самый вызов unexpected? Кстати в объявлении и в определении можно разные спецификации исключений писать, странно

Добавлено через 7 минут
вот ещё появился вопрос
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
#ifndef CIRCLE_H
#define CIRCLE_H
 
#pragma once
 
#include <iostream>
 
 
namespace geometry {
 
    const double M_PI = 3.1415;
 
    class Circle
    {
    protected:
        double R;       //радиус
    public:
        Circle() throw();
        Circle(const Circle&) throw();
        Circle(const double& _r) throw();
 
 
        Circle&         operator=(const Circle&) throw();
        
        virtual Circle&         setRadius(const int&) throw();
 
        virtual double          s() const throw();      //Площадь
        virtual double          l() const throw();      //Длинна
        virtual double          r() const throw();      //Собственно радиус
 
        void            print() const;
 
        
 
        ~Circle();
 
    };
 
 
}
 
#endif
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
#ifndef CONE_H
#define CONE_H
 
#pragma once
 
#include <iostream>
#include <cmath>
#include "circle.h"
 
 
namespace geometry
{
 
 
    class Cone :
        public virtual Circle
    {
    private:
        double H; //Высота
    public:
        Cone();
        Cone(const Cone&);
        Cone(const double& radius, const double& height);
 
        Cone&           operator=(const Cone&);
 
        Cone&           setHeight(const double&);
        double          v() const /*throw()*/;
        double          s() const /*throw()*/;
 
        void            print() const;
 
 
        ~Cone();
    };
 
 
 
 
}
 
#endif
всё читать необязательно, главное обратить внимание на функцию s(). Вроде ведь можно заместить её методом с не меннее ограничительной спецификацией, в классе circle она не выбрасывает исключений, а в классе cone она замещена функцией которая выбрасывает любые исключения, как так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru