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

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

Восстановить пароль Регистрация
 
ramarren14
2 / 2 / 0
Регистрация: 14.07.2011
Сообщений: 49
16.11.2011, 19:07     Исключения #1
Упражняюсь в программировании. Написал абстрактный класс Shape, от которого наследуются Quadr и Treyg. Создал класс исключения Exeption, причем если в нем не описывать переменные члены, а просто в блоке catsh написать cout<<" error ", то сообщение выводится на экран. Но как только описал переменную itsVal и вызвал метод в catsh, cразу выдает, что функции недоступны.

Вот класс Quadr:
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
#ifndef QUADR_H
#define QUADR_H
#include "Point.h"
#include "Shapex.h"
 
class Exeption
{
    Exeption():itsValue(0) {}
    Exeption(int val):itsValue(val) {}
    ~Exeption() {}
    int GetValue() const {return itsValue;}
protected:
    int itsValue;
};
 
class Quadr:public Shapex
{
public:
    friend class Point;
    Quadr();
    Quadr(double,double,double,double,double,double,double,double);
    virtual ~Quadr();
    double LenDiagOne() const;
    double LenDiagTwo() const;
    virtual double GetArea() const;
    virtual double GetPer() const;
private:
    Point a,b,c,d;
};
 
#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
43
44
45
46
47
48
#include "Quadr.h"
#include "Point.h"
#include<iostream>
 
Quadr::Quadr():
a(0,0),
b(0,0),
c(0,0),
d(0,0)
{}
 
Quadr::Quadr(double i,double u,double y,double t,double r,double e,double w,double q):
a(i,u),
b(y,t),
c(r,e),
d(w,q)
{}
 
Quadr::~Quadr()
{}
 
double Quadr::LenDiagOne() const
{
    return a.Len(c);
}
 
double Quadr::LenDiagTwo() const
{
    return b.Len(d);
}
 
double Quadr::GetArea() const
{
    double p_half;
    double area_tr_one; 
    double area_tr_two;
    p_half=0.5*(a.Len(b)+b.Len(c)+c.Len(a));
    area_tr_one=sqrt(p_half*(p_half-a.Len(b))*(p_half-a.Len(d))*(p_half-b.Len(d)));
    area_tr_two=sqrt(p_half*(p_half-b.Len(c))*(p_half-c.Len(d))*(p_half-b.Len(d)));
    return area_tr_one+area_tr_two;
}
 
double Quadr::GetPer() const
{
    if ((a.Len(b)+b.Len(c)+c.Len(d)+d.Len(a))==0)
    throw Exeption();
    return (a.Len(b)+b.Len(c)+c.Len(d)+d.Len(a));
}
Ну и main:
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
#include<iostream>
#include "Point.h"
#include "Quadr.h"
#include "Treyg.h"
using namespace std;
 
int main()
{
    Shapex* Ptr=0;
    double (Shapex::*PtrFun) () const=0;
    int choice_one=0;
    int choice_two=0;
 
    cout<<"enter need shape (1)-Quadr (2)-Treyg:";
 
    cin>>choice_one;
    switch(choice_one)
    {
        case 1: 
            Ptr=new Quadr(0,0,0,0,0,0,0,0); 
            break;
        case 2:
            Ptr=new Treyg(0,0,0,1,1,0); 
            break;
        default: cout<<" error ";
    }
 
    cout<<"choose function (1)-Area (2)-Perimetr";
 
    cin>>choice_two;
    switch(choice_two)
    {
    case 1:
        PtrFun=&Shapex::GetArea; break;
    case 2:
        PtrFun=&Shapex::GetPer; break;
    default: cout<<" error ";
    }
 
    try
    {
    cout<<(Ptr->*PtrFun) ();
    }
 
    catch(const Exeption & the_Exept)
    {
        cout<<the_Exept.GetValue();
    }
 
    delete Ptr;
    Ptr=0;
    return 0;
}
Кто может указать на ошибки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2011, 19:07     Исключения
Посмотрите здесь:

Исключения C++
исключения c++ C++
Исключения C++
C++ Исключения
C++ Исключения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 19:09     Исключения #2
ramarren14, public забыли указать в классе Exeption. И кстати Exception правильно.
ramarren14
2 / 2 / 0
Регистрация: 14.07.2011
Сообщений: 49
16.11.2011, 19:26  [ТС]     Исключения #3
Спасибо. А вообще хорошим стилем считается указывать классы исключений отдельно в Exception.h и Exception.cpp или помещать в какие либо классы?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 19:27     Исключения #4
ramarren14, Хорошим стилем считается либо юзать стандартные исключения, либо наследоваться от стандартных. А файлы. По сути не важно. Но не в классы точно.
Сыроежка
Заблокирован
16.11.2011, 19:29     Исключения #5
Цитата Сообщение от ramarren14 Посмотреть сообщение
Спасибо. А вообще хорошим стилем считается указывать классы исключений отдельно в Exception.h и Exception.cpp или помещать в какие либо классы?
Вы все свалили в одну кучу: и файлы и классы!

Естественно определения классов нужно помещать в свой заголовочный файл да к тому же в свое пространство имен!

Что касается файлов .cpp, то они создаются по необходимости, если не все можно объявить и определить в заголовочном файле.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 19:35     Исключения #6
Сыроежка, Ну если ситуация : есть некий класс, для него есть свой хедер. Нужно исключение по сути специально для этого класса, которое наследуется допустим от std::logic_error и имеет в себе только конструктор - то для чего помещать его в свой хедер? ИМХО абсолютно не имеет резона.
Сыроежка
Заблокирован
16.11.2011, 19:50     Исключения #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Сыроежка, Ну если ситуация : есть некий класс, для него есть свой хедер. Нужно исключение по сути специально для этого класса, которое наследуется допустим от std::logic_error и имеет в себе только конструктор - то для чего помещать его в свой хедер? ИМХО абсолютно не имеет резона.
Я говорил о классах. А в вашем примере, как я понимаю, класс исключения является вложенным классом другого класса. Так какие проблемы?! Вы ничем не противоречите тому, что я сказал.
Ежели это не вложенные классы, то все равно они должны находиться в одном пространстве имен, так как исключения являются частью интерфейса объявленного класса.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 19:53     Исключения #8
Сыроежка, Не вложенный. Да в одном спейсе.
Видимо не совсем понял ваше предыдущее сообщение, подумалось, что вы рекомендуете для каждого класса свой хедер.
Сыроежка
Заблокирован
16.11.2011, 19:58     Исключения #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Сыроежка, Не вложенный. Да в одном спейсе.
Видимо не совсем понял ваше предыдущее сообщение, подумалось, что вы рекомендуете для каждого класса свой хедер.
Я имел в виду не для каждого класса, а для классов, то есть что объявления классво должны быть описаны в заголовочных файлах и желательно в пространстве имен пользователя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 19:59     Исключения
Еще ссылки по теме:

C++ Исключения
C++ Исключения
C++ Исключения

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 19:59     Исключения #10
Сыроежка, Да я собственно уже понял. Извиняюсь.
Yandex
Объявления
16.11.2011, 19:59     Исключения
Ответ Создать тему
Опции темы

Текущее время: 11:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru