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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
23.08.2012, 02:04     о связи классов и наследовании даты #1
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


Как можно еще передать дату с базавого класса на дерайвный ??? кроме как композиционной связи ???
Можно ли это сделать через наследование ??? Я хочу вызывать дату которую сетю в мейне через страк дата
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 02:04     о связи классов и наследовании даты
Посмотрите здесь:

C++ Преобразования объектов классов в объекты других классов
О виртуальном наследовании C++
Ошибка в наследовании C++
не до понимание в наследовании C++
Указатели при наследовании классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Leeto
 Аватар для 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 Посмотреть сообщение
это не возможно
да ладно не возможно наверняка можно сказать наследнику с каким ниб условием
мол забирай дату у последнного сделанного объекта базового класса

это же не противоречит логике ни какой... ничего не наруешь только надо граммотно ссылки прописать... еще бы знать как
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
4iFF
 Аватар для 4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:30     о связи классов и наследовании даты #22
Leeto, ну да о печатался малость. Конечно я я имел ввиду "в директивах препроцессора". Верхний регистр ну это просто по общепринятому соглашению, а насчет пространства имен включение всего пространства имен std считается плохим стилем программирования, так как таким образом включается все содержимое пространства имен, что повышает вероятность конфликта имен.
Leeto
 Аватар для 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)
 
...
что ниб типа того... тогда было бы проще ))
мож в след версии с++ появиться )
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
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() // записываем в непренадлежащюю нам память поскольку это стек то скорее всего программа рухнет
приводить наследников к базовому это нормально
а базовый к наследнику это изврат
4iFF
 Аватар для 4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:41     о связи классов и наследовании даты #25
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
25.08.2012, 00:47     о связи классов и наследовании даты #26
Цитата Сообщение от Leeto Посмотреть сообщение
почему нельзя вызывать явное наследование не дефолтного конструктора базавого класса
Цитата Сообщение от Leeto Посмотреть сообщение
DerivedClass (): BaseClass (Data& obj_Data)
данные то кому передавать будешь???
Цитата Сообщение от Leeto Посмотреть сообщение
да ладно не возможно наверняка можно сказать наследнику с каким ниб условием
мол забирай дату у последнного сделанного объекта базового класса
серьезно Ну научи

Добавлено через 3 минуты
во время исполнения нет ни базовых ни наследников
просто выделяется память операционной системой, и как ты ей скажешь что не хочу так а хочу эдак
Leeto
 Аватар для 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
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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, или быть статически известным (читай: быть глобальным).

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

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

Добавлено через 4 минуты
Цитата Сообщение от 4iFF Посмотреть сообщение
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
совсем не хочет подставить под сомнения чей то опыт или знания
еще раз извиняюсь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 01:25     о связи классов и наследовании даты
Еще ссылки по теме:

C++ Ошибка в наследовании
C++ Выделение памяти при наследовании классов
На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
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( передать по ссылке, али ишо как)

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


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

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