Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1

о связи классов и наследовании даты

23.08.2012, 02:04. Показов 2495. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
base.hpp
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
#ifndef base_hpp
#define base_hpp
 
#include "Data.hpp"
#include <iostream> 
 
using namespace std; 
 
class base 
    {
 
    public :
 
        Data inter_objd; 
 
        base () 
            {
                inter_objd.a =  22;
                inter_objd.b = 55; 
            }; 
 
 
        base(Data& objd )
            {
                inter_objd = objd; 
            }
 
        void print (double a)
        {
            cout << a; 
        
        }
 
 
 
 
    } ; 
 
#endif


Data.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef Data_hpp
#define Data_hpp
 
struct Data 
{
 
double a; 
double b; 
 
};
 
#endif


dir.hpp
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
#ifndef dir_hpp
#define dir_hpp
 
 
#include "base.hpp"
#include "Data.hpp"
 
using namespace std; 
class dir : public base 
{
 
public : 
    
//  Data objDD; 
 
 
    
    base* bb; 
    //base bb; 
 
    dir( ) : base()
    {
        
    }
 
 
    
 
    double  calc () 
    {
        return  bb->inter_objd.a * bb->inter_objd.b; 
    }
 
 
};
 
#endif


main.cpp
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
#ifndef dir_hpp
#define dir_hpp
 
 
#include "base.hpp"
#include "Data.hpp"
 
using namespace std; 
class dir : public base 
{
 
public : 
    
//  Data objDD; 
 
 
    
    base* bb; 
    //base bb; 
 
    dir( ) : base()
    {
        
    }
 
 
    
 
    double  calc () 
    {
        return  bb->inter_objd.a * bb->inter_objd.b; 
    }
 
 
};
 
#endif


Как можно еще передать дату с базавого класса на дерайвный ??? кроме как композиционной связи ???
Можно ли это сделать через наследование ??? Я хочу вызывать дату которую сетю в мейне через страк дата
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2012, 02:04
Ответы с готовыми решениями:

Ошибка в наследовании классов
есть 2 класса , один должен наследовать другой вот первый класс struct people { public string surname, name,...

Указатели при наследовании классов
Здравствуйте , заданием было реализовать однонаправленный список как класс и затем используя механизм наследования создать базу данных на...

Выделение памяти при наследовании классов
Здравствуйте! У меня есть метод который, читает память занимаемую классом. Есть несколько базовых классов и два наследуемых класса -...

29
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
23.08.2012, 02:34
Цитата Сообщение от Leeto Посмотреть сообщение
Как можно еще передать дату с базавого класса на дерайвный ???
что значит передать? наследование должно соответствовать LSP короче говоря класс В может быть унаследован от класса А если B является А
1
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 04:28
Не очень понятна проблема. И поправьте main.cpp - вы не тот код туда скопировали.
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 14:24  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Не очень понятна проблема. И поправьте main.cpp - вы не тот код туда скопировали.
Извиняюсь...
Ща поправлю и там на мейне объясну что я имел ввиду

Добавлено через 17 часов 51 минуту
//BaseClass.hpp
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
//BaseClass.hpp
 
 
 
#ifndef BaseClass_hpp
#define BaseClass_hpp
 
#include "Data.hpp"
#include <iostream> 
 
using namespace std; 
 
class BaseClass 
    {
 
    public :
 
        Data internal_object_Data; 
 
        BaseClass () 
            {
                internal_object_Data.a =  222222;
                internal_object_Data.b = 555555; 
            }; 
 
 
        BaseClass(Data& objd )
            {
                internal_object_Data = objd; 
            }
 
        void print (double a)
        {
            cout <<"\n print() from BaseClass:  " <<  a; 
        
        }
    } ; 
 
#endif



//Data.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Data.hpp
 
 
#ifndef Data_hpp
#define Data_hpp
 
struct Data 
{
 
double a; 
double b; 
 
};
 
#endif


//DerivedClass.hpp
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
//DerivedClass.hpp
#ifndef DerivedClass_hpp
#define DerivedClass_hpp
 
 
#include <iostream> 
 
#include"BaseClass.hpp"
 
using namespace std; 
 
class DerivedClass : public BaseClass
    {
 
    public :
    
        BaseClass* composition_obj_base; 
        
            DerivedClass () : BaseClass()
            {
                composition_obj_base = &BaseClass(); 
            }
 
 
 
        DerivedClass (BaseClass& Obj_BC) : BaseClass()
            {
                composition_obj_base = &Obj_BC; 
            }
 
 
      double  Calc ( )
            {
                
                return composition_obj_base->internal_object_Data.a *=  5; 
            }
 
      
    } ; 
 
#endif



// main.cpp
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
// main.cpp
 
 
#include <iostream>
 
#include "BaseClass.hpp"
#include "DerivedClass.hpp"
#include "Data.hpp"
 
 
using namespace std; 
 
int  main ()
 
{
 
    Data objData ;
        {
            objData.a = 5; 
            objData.b = 10; 
        }
 
    BaseClass   objbase1; 
    cout << "\n objbase1 a : " ; 
    objbase1.print(objbase1.internal_object_Data.a);
    BaseClass objbase(objData); 
 
    DerivedClass objdefault_const; 
 
    DerivedClass objdir(objbase); 
 
 
    cout << "\n objdefault_const a : " ; 
    objdefault_const.print(objdefault_const.Calc());
    cout << "\n" ; 
    cout << "\n objdir Calc : " ; 
    objdir.print( objdir.Calc()); 
 
 
 
cout << "\n\n\n" ; 
return 0 ; 
}



Обновил название переменных

Добавлено через 4 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
что значит передать? наследование должно соответствовать LSP короче говоря класс В может быть унаследован от класса А если B является А
Передать я имею ввиду конструктор :
сетим дату в базовый класс
C++
1
2
3
4
5
6
7
8
9
10
Data objData ;
        {
            objData.a = 5; 
            objData.b = 10; 
        }
 
    BaseClass   objbase1; 
    cout << "\n objbase1 a : " ; 
    objbase1.print(objbase1.internal_object_Data.a);
    BaseClass objbase(objData);
передаем эту дату в деривативный класс

C++
1
DerivedClass objdir(objbase);
использую композиционный объект

C++
1
2
3
4
 DerivedClass (BaseClass& Obj_BC) : BaseClass()
            {
                composition_obj_base = &Obj_BC; 
            }
Вопрос в чем как можно "передать" по другому ???
Т.е. для того чтобы "передать " обязательно создавать композиционный объект или можно без него обойтись... например используя только связь наследования ???
если да то как это сделать ???
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
24.08.2012, 16:46
Нужно в наследнике создать конструктор вида:
C++
1
derived(const data& data_obj):base(data_obj){}
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 20:51  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Нужно в наследнике создать конструктор вида:
C++
1
derived(const data& data_obj):base(data_obj){}
так все равно в объект наследника придется пихать объект даты

можно тогда без явного наследования конструктора обойтись ...

хочется чтоб ты типа создаешь только объект с дефолтным конструктором наследника а там уже дата базового класса которая сетится из все ну в смысле в мейне

мож как то через буст смарт пойтер можно ???
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
24.08.2012, 22:23
Хм, а можете написать, как вы хотите, чтобы это выглядело? Даже не обязательно рабочий код, просто интересно. И уже от этого будем плясать
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 22:31  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Хм, а можете написать, как вы хотите, чтобы это выглядело? Даже не обязательно рабочий код, просто интересно. И уже от этого будем плясать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Data d;
d.a = 3;
d.b = 2; 
 
 
 
Base b (d); 
 
DiravedClass dd; 
 
cout <<  dd.calc ; 
 
OUTPUT : 3*5 = 15(считает по дате которую засетили в бейс классе )
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 22:41
Эм... И каким образом dd будет знать, что надо взять именно из b, а не из другого экземпляра?
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 22:44  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эм... И каким образом dd будет знать, что надо взять именно из b, а не из другого экземпляра?
Вот и я задаюсь этим вопрос возможно это или нет
ведь dd сетит дефолтную дату из b почему он не может просетить дату из вне?

как то типа внутри дефолтного конструктора dd прописать композиционный объект базавого класса который будет забирать дату... я не знаю
вот эту дефолтную дату он видет и забирает я как то изъеб... ся уже не помню и забирал эту дату а из все не видет
C++
1
2
3
4
5
 BaseClass () 
            {
                internal_object_Data.a =  222222;
                internal_object_Data.b = 555555; 
            };
как то я знаю по ссылке передать ккак то хитрожопа... блин
ну совсем как то не круто есть иерархическая связь и надо еще при пихивать композиционную чтоб все работало неужели нельзя без композиции
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
24.08.2012, 22:53
Цитата Сообщение от Leeto Посмотреть сообщение
я как то изъеб... ся уже не помню и забирал эту дату а из все не видет
а как он будет видеть если ты не сказал откуда смотреть???
Цитата Сообщение от Leeto Посмотреть сообщение
C++
1
2
3
4
5
Data d;
d.a = 3;
d.b = 2; 
Base b (d); 
DiravedClass dd;
а если будет так
C++
1
2
3
4
5
6
7
8
9
10
Data d;
d.a = 3;
d.b = 2; 
 
Data d1;
d.a = 4;
d.b = 6; 
Base b (d); 
Base v (d1); 
DiravedClass dd;
откуда dd будет знать из какого объекта берем??
проще сделать DiravedClass наследником Base и объект создавать так
C++
1
DiravedClass dd (d);
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 22:54
Потому что определение класса dd статическое, оно обрабатывается во время компиляции. Соответственно, значения по умолчанию тоже, поэтому он их может использовать. Экземпляр класса создаётся динамически, во время исполнения. При компиляции класс dd понятия не имеет о том, что есть какой-то там b, из которого ему надо взять значения. И даже шаблонами нельзя это сделать, потому что значение-объект создаётся во время исполнения, а шаблоны отрабатывают при компиляции.

Передавайте в dd при создании ссылку на тот b и выгребайте оттуда все нужные данные. Это простое и понятное решение.
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 22:57  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а как он будет видеть если ты не сказал откуда смотреть???

а если будет так
C++
1
2
3
4
5
6
7
8
9
10
Data d;
d.a = 3;
d.b = 2; 
 
Data d1;
d.a = 4;
d.b = 6; 
Base b (d); 
Base v (d1); 
DiravedClass dd;
ну вообще да логично...

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
откуда dd будет знать из какого объекта берем??
проще сделать DiravedClass наследником Base и объект создавать так
C++
1
DiravedClass dd (d);
Да ну зачем путаница какая то

проще сразу дату в наследнике сетить
а вейс вынести функции аля распечатать или что то типа того
зачем и туда и туда сетить одно и тоже два раза лишняя операция , разве нет ???
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
24.08.2012, 22:59
Можно сделать так:
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
class base
{
public:
    static int a;
};
int base::a = 0;
 
class derived:public base
{
public:
    int b;
};
 
void main()
{
    base base1;
    base1.a = 15;
    std::cout << base1.a << std::endl;
 
    base base2;
    std::cout << base2.a << std::endl;//выведет 15
 
    derived derived1;
    std::cout << derived1.a << std::endl;//выведет 15
 
    derived derived2;
    std::cout << derived2.a << std::endl;//выведет 15
 
    derived2.a = 42;
    std::cout << base1.a << std::endl;//выведет 42
    std::cout << base2.a << std::endl;//выведет 42
    std::cout << derived1.a << std::endl;//выведет 42
    std::cout << derived2.a << std::endl;//выведет 42
    system("pause");
    return;
}
но будьте внимательны с эффектом - изменение значения static переменной меняет ее значение везде.
Второй вариант - глобальная переменная base.
Но лучше всего сделать тот констуктор, который предлагался ранее.
1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.08.2012, 23:00  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

Передавайте в dd при создании ссылку на тот b и выгребайте оттуда все нужные данные. Это простое и понятное решение.
это как например ?
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
24.08.2012, 23:03
Цитата Сообщение от Leeto Посмотреть сообщение
это как например ?
Например, таким конструктором
C++
1
2
3
4
derived(const base& base_obj)
{
    some_data = base_obj.some_data;//some_data - член класса base
}
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
24.08.2012, 23:10
Цитата Сообщение от Leeto Посмотреть сообщение
Да ну зачем путаница какая то
Госсподдя........
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
class Data
{
public:
 int a;
 int b;
};
class Base
{
protected:
 Data dt;
public:
Base(Data _dt)
    {dt.a=_dt.a;
     dt.b=_dt.b;}// или {dt=_dt}
};
class DiravedClass : public Base
{
public:
DiravedClass(const data& data_obj):Base(data_obj){};
int calc(){return dt.a+dt.b};
}
 
 
Data d;
d.a = 3;
d.b = 2; 
 
DiravedClass dd(d);  
 
cout <<  dd.calc ;
так понятнее??
1
24.08.2012, 23:46

Не по теме:

Leeto,
#ifndef base_hpp
#define base_hpp

в директивах название файла лучше писать в верхнем регистре, а имена включать отдельно а не сразу все.

1
 Аватар для Leeto
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:05  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Например, таким конструктором
C++
1
2
3
4
derived(const base& base_obj)
{
    some_data = base_obj.some_data;//some_data - член класса base
}
так ведь это уже обсуждали я думал что ниб новое

типа сделать композиционный объект внутри наследника или базового пойтером и его передовать

только если я так делаю у меня валиться

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
Госсподдя........
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
class Data
{
public:
 int a;
 int b;
};
class Base
{
protected:
 Data dt;
public:
Base(Data _dt)
    {dt.a=_dt.a;
     dt.b=_dt.b;}// или {dt=_dt}
};
class DiravedClass : public Base
{
public:
DiravedClass(const data& data_obj):Base(data_obj){};
int calc(){return dt.a+dt.b};
}
 
 
Data d;
d.a = 3;
d.b = 2; 
 
DiravedClass dd(d);  
 
cout <<  dd.calc ;
так понятнее??
так тоже самое же...
блин да понимаю я все это
мне интересно сетить дату в базовом а нумерические действия делать в наследнике

Добавлено через 1 минуту
Цитата Сообщение от 4iFF Посмотреть сообщение

Не по теме:

Leeto,
#ifndef base_hpp
#define base_hpp

в директивах название файла лучше писать в верхнем регистре, а имена включать отдельно а не сразу все.

чего ?
Директивы это ты инклюд гейты (они же препроцессоры ) называешь ?
это почему лучше ?

Во директива препроцессора это по русски называется
"Директивой препроцессора (или командной строкой препроцессора[1]) "
http://ru.wikipedia.org/wiki/%... 0%A1%D0%B8

Не по теме:


Ребят подскажите пожалуйста как сделать консоль поверх всех окон чтоб дебагить можно было удобней
спасибо

0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
25.08.2012, 00:22
Цитата Сообщение от Leeto Посмотреть сообщение
так тоже самое же...
блин да понимаю я все это
мне интересно сетить дату в базовом а нумерические действия делать в наследнике
это не возможно
этим
C++
1
Base b (d);
ты создаешь объект базового класса
а этим
C++
1
DiravedClass dd;
объект наследника
это два разных объекта. лежат в разном диапазоне памяти и друг про друга ничего не знают

если у наследника нет дополнительных элементов т.е размер классов одинаков
то можешь сделать так
C++
1
2
3
4
5
Base b (d); 
 
DiravedClass *dd=&b; 
 
cout <<  dd->calc() ;
Но это изврат еще тот
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2012, 00:22
Помогаю со студенческими работами здесь

Ошибка компиляции при наследовании классов
У меня есть класс CNew который наследует класс CTransport но при компиляции выводит ошибку ниже 4 раза для 2 строки файла CNew.h .Мне не...

Что происходит при наследовании классов?
Гуглил тут одну тему про наследование и коде встретилась строчка: D d; Что в ней конкретно происходит ? или как это называется ? ...

Ошибка при наследовании интерфейса в библиотеке классов
В решении два проекта. Один - библиотека классов, другой консольный, который с этой библиотекой работает. В одном из классов библиотеки, в...

Ошибка Type missmatch при наследовании классов
При создании объекта класса Chord появляется ошибка: E2356 Type mismatch in redeclaration of '__stdcall Chord(void...

Ошибка в наследовании: как вызвать функции дочерних классов
Всем привет. Есть такой учебный код: abstract class A { int a1; virtual void Print(); } class B:A { int b1; public...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru