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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2012, 02:04
Ответы с готовыми решениями:

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

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

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

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

29
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 00:28  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:30 22
Leeto, ну да о печатался малость. Конечно я я имел ввиду "в директивах препроцессора". Верхний регистр ну это просто по общепринятому соглашению, а насчет пространства имен включение всего пространства имен std считается плохим стилем программирования, так как таким образом включается все содержимое пространства имен, что повышает вероятность конфликта имен.
0
7 / 7 / 3
Регистрация: 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
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
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
25.08.2012, 00:41 25
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
25.08.2012, 00:47 26
Цитата Сообщение от Leeto Посмотреть сообщение
почему нельзя вызывать явное наследование не дефолтного конструктора базавого класса
Цитата Сообщение от Leeto Посмотреть сообщение
DerivedClass (): BaseClass (Data& obj_Data)
данные то кому передавать будешь???
Цитата Сообщение от Leeto Посмотреть сообщение
да ладно не возможно наверняка можно сказать наследнику с каким ниб условием
мол забирай дату у последнного сделанного объекта базового класса
серьезно Ну научи

Добавлено через 3 минуты
во время исполнения нет ни базовых ни наследников
просто выделяется память операционной системой, и как ты ей скажешь что не хочу так а хочу эдак
1
7 / 7 / 3
Регистрация: 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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 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
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
25.08.2012, 01:08  [ТС] 29
Цитата Сообщение от ValeryS Посмотреть сообщение

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

Добавлено через 4 минуты
Цитата Сообщение от 4iFF Посмотреть сообщение
Leeto, ну в написание поста я полагался на литературу. Конечно "крутые дяденьки" лучше меня шарят и полагаются на свой богатый опыт, но у меня опыт в сравнение с ними весьма скудный, поэтому я не могу что-либо опровергать или наоборот, я просто цитирую литературу.
совсем не хочет подставить под сомнения чей то опыт или знания
еще раз извиняюсь
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
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
25.08.2012, 01:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2012, 01:25
Помогаю со студенческими работами здесь

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

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

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

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

Не могу разобраться с выводом данных при наследовании классов
using System; namespace pr_konstr { class Voin { private string Name; ...

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru