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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

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

23.08.2012, 02:04. Просмотров 1087. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 02:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос о связи классов и наследовании даты (C++):

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

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

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

Как вернуть функцию, которая потерялась при наследовании классов? - C++
Предположим есть два класса: class Parent { public: void foo() { std::cout &lt;&lt; &quot;parent foo &quot; &lt;&lt; std::endl; } }; class Child...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) - C++
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
24.08.2012, 23:03 #16
Цитата Сообщение от Leeto Посмотреть сообщение
это как например ?
Например, таким конструктором
C++
1
2
3
4
derived(const base& base_obj)
{
    some_data = base_obj.some_data;//some_data - член класса base
}
1
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
24.08.2012, 23:10 #17
Цитата Сообщение от 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
4iFF
24.08.2012, 23:46
  #18

Не по теме:

Leeto,
#ifndef base_hpp
#define base_hpp

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

1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:05  [ТС] #19
Цитата Сообщение от 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/%D0%9F%...0_%D0%A1%D0%B8

Не по теме:


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

0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
25.08.2012, 00:22 #20
Цитата Сообщение от 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
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:28  [ТС] #21
Цитата Сообщение от ValeryS Посмотреть сообщение
это не возможно
этим
C++
1
Base b (d);
ты создаешь объект базового класса
а этим
C++
1
DiravedClass dd;
объект наследника
это два разных объекта. лежат в разном диапазоне памяти и друг про друга ничего не знают

если у наследника нет дополнительных элементов т.е размер классов одинаков
то можешь сделать так
C++
1
2
3
4
5
Base b (d); 
 
DiravedClass *dd=&b; 
 
cout <<  dd->calc() ;
Но это изврат еще тот
ну кухня внутри мейна это всегда изврат а если это дейстрие зашить в классы то это нормальная композиция получается

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
это не возможно
да ладно не возможно наверняка можно сказать наследнику с каким ниб условием
мол забирай дату у последнного сделанного объекта базового класса

это же не противоречит логике ни какой... ничего не наруешь только надо граммотно ссылки прописать... еще бы знать как
0
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:30 #22
Leeto, ну да о печатался малость. Конечно я я имел ввиду "в директивах препроцессора". Верхний регистр ну это просто по общепринятому соглашению, а насчет пространства имен включение всего пространства имен std считается плохим стилем программирования, так как таким образом включается все содержимое пространства имен, что повышает вероятность конфликта имен.
0
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:38  [ТС] #23
Цитата Сообщение от 4iFF Посмотреть сообщение
Leeto, ну да о печатался малость. Конечно я я имел ввиду "в директивах препроцессора". Верхний регистр ну это просто по общепринятому соглашению, а насчет пространства имен включение всего пространства имен std считается плохим стилем программирования, так как таким образом включается все содержимое пространства имен, что повышает вероятность конфликта имен.
ну насчет включать все я то же не очень люблю... но насчет плохого стиля не знаю я видел код от очень крутых дядек и они не парятся включают все и кодят себе

"ну да о печатался малость." да я без б... я просто в терменах на русском не очень шару =)

Добавлено через 4 минуты
Цитата Сообщение от 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;
откуда dd будет знать из какого объекта берем??
проще сделать DiravedClass наследником Base и объект создавать так
C++
1
DiravedClass dd (d);
почему нельзя вызывать явное наследование не дефолтного конструктора базавого класса

ну аля

C++
1
2
3
4
5
6
7
class DerivedClass : public BaseClass 
{
public
 
DerivedClass (): BaseClass (Data& obj_Data)
 
...
что ниб типа того... тогда было бы проще ))
мож в след версии с++ появиться )
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
25.08.2012, 00:40 #24
Цитата Сообщение от Leeto Посмотреть сообщение
то это нормальная композиция получается
ага нормальная
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class B
{
public:
 int a;
 int b;
 B(int _a,int _b)
     { a=_a;
       b=_b;};
} //этот класс имеет размер 2 int
class D: pulic B
{ 
public:
  int c;
 int calc(){return a+b+c};
} // этот класс имеет размер 3 int
 
..................................
B b(3,5);// выделилась 8 байт  2 int
D*d=&b; // здесь тоже 2 int про с мы ничего не знаем там лежит мусор
count<< calc() выведет неизвестно что
а если так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class B
{
public:
 int a;
 int b;
 B(int _a,int _b)
     { a=_a;
       b=_b;};
} //этот класс имеет размер 2 int
class D: pulic B
{ 
public:
  int c;
 int calc(){return с=b+a};
} // этот класс имеет размер 3 int
 
..................................
B b(3,5);// выделилась 8 байт  2 int
D*d=&b; // здесь тоже 2 int про с мы ничего не знаем там лежит мусор
count<< calc() // записываем в непренадлежащюю нам память поскольку это стек то скорее всего программа рухнет
приводить наследников к базовому это нормально
а базовый к наследнику это изврат
0
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:41 #25
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
1
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
25.08.2012, 00:47 #26
Цитата Сообщение от Leeto Посмотреть сообщение
почему нельзя вызывать явное наследование не дефолтного конструктора базавого класса
Цитата Сообщение от Leeto Посмотреть сообщение
DerivedClass (): BaseClass (Data& obj_Data)
данные то кому передавать будешь???
Цитата Сообщение от Leeto Посмотреть сообщение
да ладно не возможно наверняка можно сказать наследнику с каким ниб условием
мол забирай дату у последнного сделанного объекта базового класса
серьезно Ну научи

Добавлено через 3 минуты
во время исполнения нет ни базовых ни наследников
просто выделяется память операционной системой, и как ты ей скажешь что не хочу так а хочу эдак
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:48  [ТС] #27
Цитата Сообщение от ValeryS Посмотреть сообщение
данные то кому передавать будешь???
А что нельзя вот так имплементировать

C++
1
2
3
4
5
6
7
8
9
10
11
...
privete : 
Data * init_obj_data; 
 
...
 
public: 
DerivedClass() : Base(Data& obj_Data)
{
init_obj_data = &obj_Data
}
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 00:50 #28
Цитата Сообщение от Leeto Посмотреть сообщение
почему нельзя вызывать явное наследование не дефолтного конструктора базавого класса
ну аля
C++
1
2
3
4
5
class DerivedClass : public BaseClass 
{
public
DerivedClass (): BaseClass (Data& obj_Data)
...
что ниб типа того... тогда было бы проще ))
мож в след версии с++ появиться )
Ну флаг в руки же
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
#include <iostream>
 
struct B {
  int val;
  B(int val_) : val(val_) {}
};
 
struct A : public B {
  int val_A;
  A(int val_) : B(val_), val_A(val_ * 2) {}
};
 
int glob = 9;
 
struct C : public B {
  C() : B(glob) {}
};
 
int main()
{
  B x(2);
  A y(5);
  C z;
  std::cout << x.val   << " | "
            << y.val   << " "
            << y.val_A << " | "
            << z.val;
}
, но тут или трусы надеть, или крестик снять: obj_Data или передаваться должен в конструктор Derived, или быть статически известным (читай: быть глобальным).

> мол забирай дату у последнного сделанного объекта базового класса
Например, заведите статическую переменную, которая будет хранить ссылку на последний сделанный объект (конструктор её обновляет). Оттуда и забирайте. Хотя лучше будет сесть и подумать, действительно ли такое извращение необходимо, а то что-то от меня вся нить разговора в этом треде уже ускользает...
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 01:08  [ТС] #29
Цитата Сообщение от ValeryS Посмотреть сообщение

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

Добавлено через 4 минуты
Цитата Сообщение от 4iFF Посмотреть сообщение
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
совсем не хочет подставить под сомнения чей то опыт или знания
еще раз извиняюсь
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
25.08.2012, 01:25 #30
Цитата Сообщение от Leeto Посмотреть сообщение
но вот смотри...
смотрю
Цитата Сообщение от Leeto Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class Base 
{
public : 
Data init_data ; 
Base ()
{
objdata.a = 1; 
objdata.b = 2; 
}
кто такой objdata??? это типа init_data??? или кто-то другой??
Цитата Сообщение от Leeto Посмотреть сообщение
C++
1
2
3
Base b ; 
std::cout << "print 1" << b.a; 
std::cout << "print 1" << b.init_data.a;
откуда взялась b.a ????
что выведет b.init_data.a если init_data ты не инициализировал???

да и наследование я в твоем примере не увидел
а то что ты используешь разные конструкторы
так я больше скажу есть конструкторы с параметрами по умолчанию, конструкторы с разным количеством параметров
че ты их все не привел
ты меня научи создать папу а потом наследника и чтобы наследник знал про другого папу(потому что свой имеет совершенно другие данные)
и в каком языке программирования ты такое видел ?

Добавлено через 10 минут
Цитата Сообщение от Leeto Посмотреть сообщение
Так в чем проблема ее передать измененную
понятно что она меняется в пределах объекта b1
ну хоть это слава богу
Цитата Сообщение от Leeto Посмотреть сообщение
короче надо тупа конструктор derived вызывать.... внутри
еще раз
C++
1
B b(25);
здесь создается объект B со значением 25
C++
1
D d;
здесь создается объект D в котором уже лежит В( это его папа) + свой функционал
а b для d это чужой папа про который d ничего не знает
а чтобы узнал ему нужно рассказать про b( передать по ссылке, али ишо как)

Я ничего не знаю про твоего папу, а про своего знаю все( ну или почти все), но если ты мне про него расскажешь я буду знать, и пользоваться данными


по моему ты не разобрался в наследовании
если грубо сказать наследование есть на уровне описания классов, на уровне объектов его нет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 01:25
Привет! Вот еще темы с ответами:

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++
Доброго времени суток! Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме: У одного владельца...

не до понимание в наследовании - C++
у нас есть допустим 2 класса. Один circle, другой Point. Circle наследует от Point. Тоесть Point базовый класс а Circle производный. ...

Вопрос о наследовании - C++
Извините за ламерский вопрос, но я в тупике. Такая проблема. Есть два класса &quot;Systema&quot; и &quot;Sensors&quot;. Как сделать так чтоб в класс...

О виртуальном наследовании - C++
Хотелось бы с Вашей помощью разобраться в деталях виртуального наследования. Вопрос такой: что на физическом уровне означает выражение ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.08.2012, 01:25
Ответ Создать тему
Опции темы

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