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

rtti - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Возможно дело в цикле http://www.cyberforum.ru/cpp-beginners/thread932123.html
Задачка: Программа должна отображать меню из четырех пунктов, каждый из них помечен буквой. Если пользователь вводит букву, отличающуюся от четырех допустимых, программа должна повторно приглашать...
C++ алгоритм accumulate Допустим у меня есть вектор.Мне нужно подсчитать выборочно в нем сумму элементов.Я использую функциональный класс через алгоритм accumulate.А если мне нужно еще как-то подсчитать выборочно сумму... http://www.cyberforum.ru/cpp-beginners/thread932111.html
C++ Нулевой символ С++
Является ли нулевой символ в конце строки "\0" ложью?
Что такое унифицированное программирование? C++
То есть что такое унификация в целом и что такое унифицированные функции или что там ещё есть? Знаю только, что это как-то связанно с stl.
C++ Почему запись int в файл происходит в обратном порядке? http://www.cyberforum.ru/cpp-beginners/thread932068.html
Разбирался в способе сохранения структур в файле, наткнулся на вот такой пример: int a = 'abcd'; FILE* WriteFile; char WriteFileName = "D:\\filename.txt"; WriteFile = fopen...
C++ Borland C++3.1 Этот старый "инструмент" стоит уже давно забыть и перейти в более новый? Вообще искал, описаний про него нет, справка на англ тем более не удобна. Всё равно же в современных редакциях Bilder... подробнее

Показать сообщение отдельно
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47

rtti - C++

01.08.2013, 18:14. Просмотров 1091. Ответов 12
Метки (Все метки)

Есть код:
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
// header.h
#include <stdexcept>
#include <string>
#include <typeinfo>
#include <cstdlib>
 
class Sales
{
protected:
    enum {MONTHS = 12};   
public:
    class bad_index : public std::logic_error
    {
    private:
        int bi;  
    public:
        explicit bad_index(int ix,
            const std::string & s = "Index error in Sales object\n");
        int bi_val() const {return bi;}
        virtual ~bad_index() throw() {}
    };
    explicit Sales(int yy = 0);
    Sales(int yy, const double * gr, int n);
    virtual ~Sales() { }
    int Year() const { return year; }
    virtual double operator[](int i) const;
    virtual double & operator[](int i);
private:
    double gross[MONTHS];
    int year;
};
 
class LabeledSales : public Sales
{
  public:
    class nbad_index : public Sales::bad_index
    {
    private:
        std::string lbl;
    public:
        nbad_index(const std::string & lb, int ix,
           const std::string & s = "Index error in LabeledSales object\n");
        const std::string & label_val() const {return lbl;}
        virtual ~nbad_index() throw() {}
     };
    explicit LabeledSales(const std::string & lb = "none", int yy = 0);
    LabeledSales(const std::string & lb, int yy, const double * gr, int n);
    virtual ~LabeledSales() { }
    const std::string & Label() const {return label;}
    virtual double operator[](int i) const;
    virtual double & operator[](int i);
private:
    std::string label;
};
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
// method.cpp
#include "header.h"
using std::string;
 
Sales::bad_index::bad_index(int ix, const string & s )
    : std::logic_error(s), bi(ix)
{
}
 
Sales::Sales(int yy)
{
    year = yy;
    for (int i = 0; i < MONTHS; ++i)
        gross[i] = 0;
}
 
Sales::Sales(int yy, const double * gr, int n)
{
    year = yy;
    int lim = (n < MONTHS)? n : MONTHS;
    int i;
    for (i = 0; i < lim; ++i)
        gross[i] = gr[i];
    // for i > n and i < MONTHS
    for ( ; i < MONTHS; ++i)
        gross[i] = 0;
}
 
double Sales::operator[](int i) const
{
    if(i < 0 || i >= MONTHS)
        throw bad_index(i);
    return gross[i];
}
 
double & Sales::operator[](int i)
{
    if(i < 0 || i >= MONTHS)
        throw bad_index(i);
    return gross[i];
}
 
LabeledSales::nbad_index::nbad_index(const string & lb, int ix,
           const string & s ) : Sales::bad_index(ix, s)
{
    lbl = lb;
}
 
LabeledSales::LabeledSales(const string & lb, int yy)
         : Sales(yy)
{
    label = lb;
}
 
LabeledSales::LabeledSales(const string & lb, int yy, const double * gr, int n)
        : Sales(yy, gr, n)
{
    label = lb;
}
 
double LabeledSales::operator[](int i) const
{    if(i < 0 || i >= MONTHS)
        throw nbad_index(Label(), i);
    return Sales::operator[](i);
}
 
double & LabeledSales::operator[](int i)
{
    if(i < 0 || i >= MONTHS)
        throw nbad_index(Label(), i);
    return Sales::operator[](i);
}
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
//main.cpp
#include <iostream>
#include <typeinfo>
#include "header.h"
#include <cstdlib>
using namespace std;
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
 
    double vals1[12] =
    {
        1220, 1100, 1122, 2212, 1232, 2334,
        2884, 2393, 3302, 2922, 3002, 3544
    };
 
    double vals2[12] =
    {
        12, 11, 22, 21, 32, 34,
        28, 29, 33, 29, 32, 35
    };
 
    Sales sales1(2011, vals1, 12);
    LabeledSales sales2("Blogstar",2012, vals2, 12 );
 
    cout << "First try block:\n";
    try
    {
        int i;
        cout << "Year = " << sales1.Year() << endl;
        for (i = 0; i < 12; ++i)
        {
 
            cout << sales1[i] << ' ';
            if (i % 6 == 5)
                cout << endl;
        }
        cout << "Year = " << sales2.Year() << endl;
        cout << "Label = " << sales2.Label() << endl;
        for (i = 0; i <= 12; ++i)
        {
 
            cout << sales2[i] << ' ';
            if (i % 6 == 5)
                cout << endl;
        }
        cout << "End of try block 1.\n";
    }
    catch(Sales::bad_index & bad)
    {
        LabeledSales::nbad_index * arg;
        cout << bad.what();
        if(typeid(arg)==typeid(bad))
        {
            cout << "Company: " << bad.label_val() << endl;
        }
        cout << "bad index: " << bad.bi_val() << endl;
    }
    cout << "\nNext try block:\n";
    try
    {
        sales2[2] = 37.5;
        sales1[20] = 23345;
        cout << "End of try block 2.\n";
    }
    catch(Sales::bad_index & bad)
    {
        LabeledSales::nbad_index * arg;
        cout << bad.what();
        if(typeid(arg)==typeid(bad))
        {
            cout << "Company: " << bad.label_val() << endl;
        }
        cout << "bad index: " << bad.bi_val() << endl;
    }
    cout << "done\n";
    system("PAUSE");
    return 0;
}
Компилятор ругается(строчки 57 и 74), что 'label_val' не является методом 'Sales::bad_index', но 'LabeledSales::nbad_index' порожден от 'Sales::bad_index', что не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru