Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
#1

Наследование

09.01.2012, 12:00. Просмотров 956. Ответов 20
Метки нет (Все метки)

Помогите пожалуйста найти ошибку в коде.
Тема: Наследование классов и виртуальные функции.
Ошибка заключается в том, что переменные из первого класса не передаются во второй, хотя по идее имеют свойства protected (public тоже пробовал), а тип наследования public.
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
98
99
100
101
102
103
104
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class detail
{
protected:
    int n,i;
    struct obj
    {
        char det[20];
        int nomc,kold;
        char ak[5];
        int na,kf;
    };
    obj ob[20];
public:
    detail();
    ~detail()
    {cout<<"\nObject delete!\n";}
    void zapp();
    void func();
    virtual void vfunc();
};
detail::detail()
{
    i=0;
}
void detail::zapp()
{
    cout<<"Vvedite koli4estvo zapisei:";
    cin>>n;
    for (i=0; i<n; i++)
    {
        cout<<"Vvedite detal':";
        cin>>ob[i].det;
        cout<<"Vvedite koli4estvo detalei:";
        cin>>ob[i].kold;
        cout<<"Vvedite nomer cexa:";
        cin>>ob[i].nomc;
    }
}
void detail::func()
{
    char wed[20];
    cout<<"Vvedite interesuemuyu detal':";
    cin>>wed;
    for (i=0; i<n; i++)
    {
        if (strcmp(ob[i].det,wed)==0)
            cout<<"Koli4estvo dannyx detalei:"<<ob[i].kold;
    }
}
void detail::vfunc()
{
    cout<<"\nSoderzhimoe objecta:\nDetal'     Koli4estvo     Nomer cexa"<<endl;
    for (i=0; i<n; i++)
    {
        cout<<endl<<ob[i].det<<"               "<<ob[i].kold<<"               "<<ob[i].nomc;
    }
}
 
class ndetail: public detail
{
public:
    void zap();
    void vfunc();
};
void ndetail::zap()
{
    cout<<"\nVvedite dopolnitelnie dannye:\n";
    cout<<i<<" "<<n;
    for (i=0; i<n; i++)
        {
            cout<<"Imeet li detal' '"<<ob[i].det<<"' antikoroziinoe pokrytie? ";
            cin>>ob[i].ak;
            cout<<"Vvedite koefficient nadezhnosti dannoi detali: ";
            cin>>ob[i].kf;
        }
}
void ndetail::vfunc()
{
    cout<<"\nSostoyanie detalei:\nDetal'     Nali4ie antikora     Koefficient nadezhnosti";
    for (i=0; i<n; i++)
    {
        cout<<endl<<ob[i].det<<"             "<<ob[i].ak<<"                "<<ob[i].kf<<"%";
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    detail *p,b;
    ndetail s;
    p=&b;
    p->zapp();
    p->func();
    p->vfunc();
    p=&s;
    s.zap();
    s.vfunc();
    cout<<endl;
    system("pause");
    return 0;
}
0
Миниатюры
Наследование  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 12:00
Ответы с готовыми решениями:

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int...

наследование
во всех подклассах выдает одну и ту же ошибку, что я делаю не так? #include...

Наследование
На основе класса «Массив» создать производный класс «Ассоциативный массив»....

Наследование
Доброго утра всем, разъясните кто-нибудь пожалуйста как правильно разбивать...

Наследование
Нужно создать функцию которая получает в качестве параметра фалимию и ее ищет в...

20
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 12:03 #2
Цитата Сообщение от DimaGerrard Посмотреть сообщение
Ошибка заключается в том, что переменные из первого класса не передаются во второй
В чем это проявляется? При компиляции ошибок нет.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2012, 12:06 #3
Что куда не передаётся? Какие конкретно есть проблемы? Или вы предлагаете разбирать весь код и за вас выискивать баги? Укажите, какого результата при каких входных данных вы ожидаете и что получаете? Пока понятно одно - код компилируется и работает.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:09 #4
У тебя функции не виртуальные, а используешь полиморфно. Так нельзя.

Не по теме:

Меня на награду номинировали о_0. А я не знал... Где моя медалька? Хочу медальку!



Добавлено через 1 минуту
Цитата Сообщение от silent_1991 Посмотреть сообщение
Какие конкретно есть проблемы?
Конкретно, строка 100.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:09  [ТС] #5
добавил результат выполнения - там видно что при вызове функций из второго класса ничего не выдает, из-за того что переменная количества деталей n становится равна несуществующему значению.
Ставил для проверки в цикле само число, а не переменную и результат не менялся, т.к. структура просто не выводится, считаясь незаполненной.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:10 #6
Т.е. после строки 99 код должен быть другой...
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:14  [ТС] #7
В результате должно выводить структуру 2 раза: 1 раз после заполнения в первом классе, а второй после добавления дополнительных данных.

Добавлено через 2 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. после строки 99 код должен быть другой...
При вызове функций второго класса аналогично с первым, компилятор выдавал ошибку. Можешь попробовать поменять точку на ->. Не понимаю почему...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:19 #8
Цитата Сообщение от DimaGerrard Посмотреть сообщение
Можешь попробовать поменять точку на ->.
Строка 99 для чего?
От ответа на этот вопрос зависят все последующие строки. Либо не нужна 99, либо две последующие.
Если в итоге тебе хотелось написать p->, то я уже сказал про неправильность использования не полиморфных функций.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:26  [ТС] #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Строка 99 для чего?
От ответа на этот вопрос зависят все последующие строки. Либо не нужна 99, либо две последующие.
Если в итоге тебе хотелось написать p->, то я уже сказал про неправильность использования не полиморфных функций.
В 99 строке переменной p передается адрес объекта второго класса.
В данном случае она не нужна, согласен, забыл удалить. Просто в идеале должно было быть вот так (насколько мне объяснил препод):
detail *p,b;
ndetail s;
p=&b;
p->zapp();
p->func();
p->vfunc();
p=&s;
p->zap();
p->vfunc();
Но таким образом не хотят вызываться функции второго объекта, он их просто не видит. Где-то здесь я туплю, а препод посылает нах, т.к. сам не знает нихера...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:28 #10
Цитата Сообщение от DimaGerrard Посмотреть сообщение
он их просто не видит
Причину я объяснил ещё в посте №4. Ты полиморфно используешь не полиморфную функцию. Добавь слово virtual. И к деструктору тоже.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:28  [ТС] #11
Помоги пожалуйста вообщем как мне правильно вызывать все функции без потери данных.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:30 #12
Цитата Сообщение от DimaGerrard Посмотреть сообщение
т.к. сам не знает нихера...
Вот честное-благородное, беги ты из этой шаражки!
На ентом форуме тебя лучше научат, чем них не знающие преподы.)))

Добавлено через 39 секунд
virtual void zapp();
virtual void func();
0
silent_1991
09.01.2012, 12:31
  #13

Не по теме:

Хм, интересная тенденция - к сессии все преподы страны становятся напрочь тупыми и них... не знающими... Сказываются праздники? Или всё же надо думать, что не преподы них не знают, а студенты них не слушают? Может наши преподы не все поголовно такие плохие?

0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:34  [ТС] #14
Цитата Сообщение от Deviaphan Посмотреть сообщение
Причину я объяснил ещё в посте №4. Ты полиморфно используешь не полиморфную функцию. Добавь слово virtual. И к деструктору тоже.
Все, я понял что ты хотел мне сказать. Переделал вот так:
detail *p,b;
ndetail s;
p=&b;
b.zapp();
b.func();
p->vfunc();
p=&s;
s.zap();
p->vfunc();
Но, к сожалению, переменные и структура первого класса все равно не передалась во второй.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2012, 12:35 #15
DimaGerrard, так vfunc и так была виртуальной. Вы должны zap так же вызвать, через указатель на базовый класс.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:40  [ТС] #16
Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:

Хм, интересная тенденция - к сессии все преподы страны становятся напрочь тупыми и них... не знающими... Сказываются праздники? Или всё же надо думать, что не преподы них не знают, а студенты них не слушают? Может наши преподы не все поголовно такие плохие?

Хорошее замечание, но в данном случае такая ситуация наблюдается на протяжении всего семестра, а не ближе к сессии. Просто когда я подошел к преподу и сказал "Я сделал все как вы мне сказали, покажите мне мою ошибку" он даже смотреть не стал, а сказал "Ну у остальных групп все работает, так что ...". Причем с моей группы никто так и не сделал, а тех людей с других групп я не нашёл.

Добавлено через 2 минуты
Я понял ваши замечания и переделал программу, но от этого данные как не передавались во второй класс, так и не передаются. Гляньте плиз может я что-то с наследованием затупил, но вроде как правильно...
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2012, 12:47 #17
DimaGerrard, проблема в том, что у вас напрочь неверная архитектура. Например, у вас класс "Деталь" почему-то хранит массив каких-то obj. Давайте сделаем так: мне совершенно неохота разбираться во всём этом. Вы пишите задание, я пишу верный код, вы задаёте вопросы, я отвечаю. Просто легче написать заново правильный код, чем переделывать этот.
0
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:57  [ТС] #18
silent 1991, ну это массив объектов структуры, объявленной выше.
Но можно поступить как и ты сказал.
Задание:
Создайте программу с классом Detail, который включает следующие данные:
- наименование детали;
- количество деталей;
- номер цеха-изготовителя.
В состав класса входят следующие функции:
- конструктор с параметрами;
- деструктор;
- функция, которая вычисляет общее количество изделий указанного наименования;
- виртуальная функция просмотра состояния текущего объекта.
Производный класс содержит следующие элементы:
- наличие дополнительного антикоррозийного покрытия;
- коэффициент надежности в процентах;
- переопределенную функцию просмотра текущего состояния деталей.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2012, 13:16 #19
Что-то в этом роде:
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
#include <iostream>
#include <string>
 
class Detail
{
public:
    Detail(const std::string& name, size_t count, int number):
    m_name(name),
    m_count(count),
    m_number(number)
    {
    }
    
    virtual ~Detail()
    {
    }
    
    size_t count() const
    {
        return m_count;
    }
    
    virtual void print_state() const
    {
        std::cout << "Name: " << m_name << "; "
                  << "Count: " << m_count << "; "
                  << "Number: " << m_number;
    }
    
private:
    std::string m_name;
    size_t m_count;
    int m_number;
};
 
class ExtendedDetail : public Detail
{
public:
    ExtendedDetail(const std::string& name, size_t count, int number, bool protection, int safety):
    Detail(name, count, number),
    m_protection(protection),
    m_safety(safety)
    {
    }
    
    virtual ~ExtendedDetail()
    {
    }
    
    virtual void print_state() const
    {
        Detail::print_state();
        
        std::cout << "; Corrosion protection: " << m_protection << "; "
                  << "Safety factor: " << m_safety;
    }
    
private:
    bool m_protection;
    int m_safety;
};
 
void print_detail_state(const Detail& detail)
{
    detail.print_state();
    
    std::cout << std::endl;
}
 
int main()
{
    Detail d1("Detail 1", 10, 3);
    ExtendedDetail d2("Detail 2", 12, 8, true, 87);
    
    print_detail_state(d1);
    print_detail_state(d2);
    
    return 0;
}
1
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 13:35  [ТС] #20
silent 1991, спасибо большое, постараюсь разобраться в твоем коде)
Но, впринципе, я понял свою главную ошибку: виртуальная функция первого класса будет работать с данными, внесенными только в первом классе, а вторая - с данными только второго.
0
09.01.2012, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 13:35

Наследование
На языке С++ описать модель данных для вычисления площадей и периметров...

Наследование
Прошу помочь реализовть программу. Задание на русском: Разработать класс...

Наследование
Привет! Есть следующая ситуация: class Counter { protected: unsigned int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru