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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

Сложение экземпляра базового класса и экземпляра наследника - C++

11.04.2011, 23:15. Просмотров 2264. Ответов 29
Метки нет (Все метки)

Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения "знал" операнда-наследника (для того и сделан в нем указатель prev). Может быть, лучше это сделать по-другому? Если да, то как? Если нет, то скажите, что дописать в операторах?

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
class A {
 protected: double x, y;
 public: A () {x=1; y=1;}
 double get_x () {return x;}
 double get_y () {return y;}
};
 
class B:public A {
 B *prev;
 public: B () {prev=0;}
 B (const B &);
 ~B () {delete prev;}
 B& operator = (const A &);
 B& operator = (const B &);
 friend ostream& operator << (ostream &, const B &);
 friend B operator + (B, A);
};
 
 
// Копирующий конструктор наследника.
B::B (const B &right) {
 prev=0;
 x=right.x;
 y=right.y;
}
 
 
// Присваивание экземпляру наследника экземпляра родителя.
B& B::operator =(const A &right) {
 x=right.get_x();
 y=right.get_y();
 return *this;
}
 
 
// Присваивание наследнику наследника.
B& B::operator = (const A &right) {
 if (this!=&right) {
  delete prev;
  prev=0;
  x=right.x;
  y=right.y;
 }
 
 return *this;
}
 
 
// Операция сложения родителя и наследника.
B operator + (B left, A right) {
 method_with_prev res;
 res.c = left.c + right.get_c();
 res.d = left.d + right.get_d();
 res.prev = &left; // Думал, что так решается, но не уверен.
 return res;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2011, 23:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложение экземпляра базового класса и экземпляра наследника (C++):

Создание нового экземпляра дочернего класса из экземпляра базового - C++
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Создание экземпляра для наследника абстрактного класса - C++
Есть абстрактный базовый класс: class Base { public: int variable; virtual void clearVirtualFunction() = 0; }; ...

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

При создании экземпляра класса, создается 2 экземпляра вместо 1 - C++
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Вызов конструктора базового класса из класса-наследника - C++
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...

Создание базового класса и наследника - C++
в данной программе , попросили добавить в void main ///camera obj//// и дописать в конструктор camera::camera() сразу вывод через...

29
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 21:14  [ТС] #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника. Здесь, судя по всему, фишка в том, что этот третий объект должен знать о его папе, не в смысле наследования, а в смысле того, что в качестве его папы выступал такой же экземпляр дочернего класса, как и сам получившийся ребёнок. Т.е. у "сыночка" должен быть на "листочке" записан адресок "папаши" (при этом всём забываем, что такие же термины используются в наследовании - нам сейчас важна область "генов"). Уж простите за последнюю метафору)))
Именно это я имел в виду!

ValeryS, проверю завтра.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,244
12.04.2011, 21:15 #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника
ну тогда еще проще
создаем базовый класс
от него создаем класс родителя
и класс ребенка(можно тот же самый)
в классе указатель на два базовых класса (это будут родители)
при сложении просто присваиваем значения объектов родителей этим указателям.
(этак ведь можно и дерево создать )
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
12.04.2011, 21:24 #18
Полагаю, имелось ввиду нечто вроде:
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
#include <iostream>
 
class A
{
public:
    A(int a = 0):
    _a(a)
    {
    }
 
    void set_a(int a)
    {
        _a = a;
    }
 
    int get_a() const
    {
        return _a;
    }
 
private:
    int _a;
};
 
class B: public A
{
public:
    B(int a = 0, int b = 0, B *parent = 0):
    _b(b),
    _parent(parent)
    {
        set_a(a);
    }
 
    void set_b(int b)
    {
        _b = b;
    }
 
    int get_b() const
    {
        return _b;
    }
 
    const B *get_parent() const
    {
        return _parent;
    }
 
private:
    int _b;
    B *_parent;
};
 
B operator+(const A &left, const B &right)
{
    return B (left.get_a() + right.get_a(), right.get_b(), const_cast< B * >(&right));
}
 
int main()
{
    A a(10);
    B b(15, 5);
    B sum;
 
    sum = a + b;
 
    std::cout << sum.get_a() << std::endl;
    std::cout << sum.get_b() << std::endl;
    std::cout << sum.get_parent()->get_a() << std::endl;
    std::cout << sum.get_parent()->get_b() << std::endl;
 
    return 0;
}
1
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 22:05  [ТС] #19
silent_1991, а зачем вы "_" ставите перед вызовами функций и именами переменных? Это под .NET?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
12.04.2011, 22:07 #20
Red Planet, нет, это просто один из стилей программирования. _ - всего навсего часть имени. И перед вызовами функций я не ставлю _. Я так именую только закрытые переменные-члены.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
14.04.2011, 09:55  [ТС] #21
silent_1991, а что касается очистки динамической памяти, то обычный деструктор для B тут не пойдет поскольку существует много объектов, ссылающихся на одну и ту же область памяти, так?

Обычный деструктор.
C++
1
~B { delete parent; }
Будет ли правильным написать функцию очистки памяти и применить ее один раз?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class B {
public: void clear_B { delete _parent; }
// методы и переменные.
private:
    int _b;
    B *_parent;
};
 
int main() {
    A a(10), a2 (23), a3 (12);
    B b(15, 5);
    B sum, sum2, sum3;
 
    sum = a + b; // Здесь указатель на b.
    sum2 = a2 + b; // Здесь указатель на b.
    sum3 = a3 + b; // Здесь указатель на b.
 
    b.clear_B(); // очистка памяти.
}
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.04.2011, 12:33 #22
Погодите, а зачем её вообще очищать? У нас же динамическая память вообще не используется, мы просто выставляем указатель на некоторый объект. Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
14.04.2011, 21:46  [ТС] #23
Цитата Сообщение от silent_1991 Посмотреть сообщение
Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
В моей задаче такого в принципе не может быть, но скажите все равно. На будущее.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.04.2011, 21:50 #24
Можно, например, хранить в B не один указатель, а два - один на объект, от которого порождён данный, а второй на объект, который был порождён данным. Тогда в деструкторе B обязательно надо проходить по указателю на детя и обнулять в нём указатель на себя - нулевой указатель будет являться индикатором, что объект более не существует (или же никогда и не существовал). В случае, если один объект может породить множество других, следует хранить массив указателей на детей, и в деструкторе проходить по всем элементам массива и обнулять указатели на себя.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,244
14.04.2011, 23:07 #25
Цитата Сообщение от Red Planet Посмотреть сообщение
В моей задаче такого в принципе не может быть,
а мы вообше не знаем ТВОЮ задачу
Цитата Сообщение от silent_1991 Посмотреть сообщение
хранить в B не один указатель, а два - один на объект, от которого порождён данный,
с какого перепугу он будет знать от кого он рожденный(наследование)????
Цитата Сообщение от silent_1991 Посмотреть сообщение
второй на объект, который был порождён данным
\
а это тем более
наследование идет на уровне написания программы(компиляциии) а не на уровне исполнения
еще раз повторю
Цитата Сообщение от ValeryS Посмотреть сообщение
родитель ничего не знает о наследнике
наследник о родителе знает все
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.04.2011, 23:10 #26
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать, а уж потом крутить пальцем у виска (если, конечно, останется необходимость). Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,244
14.04.2011, 23:23 #27
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать,
Re: Сложение экземпляра базового класса и экземпляра наследника
и что я дожен читать????
Я тебе сказал что это не реально!
наоборот можно.
Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
это ваши проблемы используя известные термины вкладывать свой смысл
и на ваш вопрос я ответил в 17 посте
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.04.2011, 23:30 #28
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и что я дожен читать????
Например, это: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
Я тебе сказал что это не реально! наоборот можно.
Не знаю, у меня как-то получилось: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
это ваши проблемы используя известные термины вкладывать свой смысл
Да нет, у меня как раз никаких проблем нету.
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и на ваш вопрос я ответил в 17 посте
Вопросов у меня не было вообще.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,244
14.04.2011, 23:35 #29
ну тады все

Добавлено через 2 минуты
Мне нравятся ссылки на меня самого
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.04.2011, 23:36 #30
ValeryS, ссылки я давал на себя, сообщение, на которое даётся ссылка, выравнивается по верхнему краю.
0
14.04.2011, 23:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2011, 23:36
Привет! Вот еще темы с ответами:

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

Вызвать метод базового класса из метода наследника - C++
Есть базовый класс с виртуальным методом, выводящим значение его полей. В классе-наследнике есть метод с таким же названием, и он также...

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include &lt;tchar.h&gt; class A { public: A(); int aVar; }; class B : public A


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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