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

Наследование - C++

Восстановить пароль Регистрация
 
 
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:00     Наследование #1
Помогите пожалуйста найти ошибку в коде.
Тема: Наследование классов и виртуальные функции.
Ошибка заключается в том, что переменные из первого класса не передаются во второй, хотя по идее имеют свойства 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;
}
Миниатюры
Наследование  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 12:00     Наследование
Посмотрите здесь:

Наследование C++
C++ Наследование
C++ Наследование
Наследование C++
C++ Наследование
C++ Наследование
Наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 12:03     Наследование #2
Цитата Сообщение от DimaGerrard Посмотреть сообщение
Ошибка заключается в том, что переменные из первого класса не передаются во второй
В чем это проявляется? При компиляции ошибок нет.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 12:06     Наследование #3
Что куда не передаётся? Какие конкретно есть проблемы? Или вы предлагаете разбирать весь код и за вас выискивать баги? Укажите, какого результата при каких входных данных вы ожидаете и что получаете? Пока понятно одно - код компилируется и работает.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:09     Наследование #4
У тебя функции не виртуальные, а используешь полиморфно. Так нельзя.

Не по теме:

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



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

Добавлено через 2 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. после строки 99 код должен быть другой...
При вызове функций второго класса аналогично с первым, компилятор выдавал ошибку. Можешь попробовать поменять точку на ->. Не понимаю почему...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:19     Наследование #8
Цитата Сообщение от DimaGerrard Посмотреть сообщение
Можешь попробовать поменять точку на ->.
Строка 99 для чего?
От ответа на этот вопрос зависят все последующие строки. Либо не нужна 99, либо две последующие.
Если в итоге тебе хотелось написать p->, то я уже сказал про неправильность использования не полиморфных функций.
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();
Но таким образом не хотят вызываться функции второго объекта, он их просто не видит. Где-то здесь я туплю, а препод посылает нах, т.к. сам не знает нихера...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:28     Наследование #10
Цитата Сообщение от DimaGerrard Посмотреть сообщение
он их просто не видит
Причину я объяснил ещё в посте №4. Ты полиморфно используешь не полиморфную функцию. Добавь слово virtual. И к деструктору тоже.
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:28  [ТС]     Наследование #11
Помоги пожалуйста вообщем как мне правильно вызывать все функции без потери данных.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.01.2012, 12:30     Наследование #12
Цитата Сообщение от DimaGerrard Посмотреть сообщение
т.к. сам не знает нихера...
Вот честное-благородное, беги ты из этой шаражки!
На ентом форуме тебя лучше научат, чем них не знающие преподы.)))

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

Не по теме:

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

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();
Но, к сожалению, переменные и структура первого класса все равно не передалась во второй.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 12:35     Наследование #15
DimaGerrard, так vfunc и так была виртуальной. Вы должны zap так же вызвать, через указатель на базовый класс.
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:40  [ТС]     Наследование #16
Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:

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

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

Добавлено через 2 минуты
Я понял ваши замечания и переделал программу, но от этого данные как не передавались во второй класс, так и не передаются. Гляньте плиз может я что-то с наследованием затупил, но вроде как правильно...
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.01.2012, 12:47     Наследование #17
DimaGerrard, проблема в том, что у вас напрочь неверная архитектура. Например, у вас класс "Деталь" почему-то хранит массив каких-то obj. Давайте сделаем так: мне совершенно неохота разбираться во всём этом. Вы пишите задание, я пишу верный код, вы задаёте вопросы, я отвечаю. Просто легче написать заново правильный код, чем переделывать этот.
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 12:57  [ТС]     Наследование #18
silent 1991, ну это массив объектов структуры, объявленной выше.
Но можно поступить как и ты сказал.
Задание:
Создайте программу с классом Detail, который включает следующие данные:
- наименование детали;
- количество деталей;
- номер цеха-изготовителя.
В состав класса входят следующие функции:
- конструктор с параметрами;
- деструктор;
- функция, которая вычисляет общее количество изделий указанного наименования;
- виртуальная функция просмотра состояния текущего объекта.
Производный класс содержит следующие элементы:
- наличие дополнительного антикоррозийного покрытия;
- коэффициент надежности в процентах;
- переопределенную функцию просмотра текущего состояния деталей.
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 13:35     Наследование
Еще ссылки по теме:

C++ наследование С++
C++ наследование
C++ наследование
Наследование C++
Наследование C++

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

Или воспользуйтесь поиском по форуму:
DimaGerrard
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 11
09.01.2012, 13:35  [ТС]     Наследование #20
silent 1991, спасибо большое, постараюсь разобраться в твоем коде)
Но, впринципе, я понял свою главную ошибку: виртуальная функция первого класса будет работать с данными, внесенными только в первом классе, а вторая - с данными только второго.
Yandex
Объявления
09.01.2012, 13:35     Наследование
Ответ Создать тему
Опции темы

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