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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
11.04.2011, 23:15     Сложение экземпляра базового класса и экземпляра наследника #1
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения "знал" операнда-наследника (для того и сделан в нем указатель 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2011, 23:15     Сложение экземпляра базового класса и экземпляра наследника
Посмотрите здесь:

C++ Создание экземпляра для наследника абстрактного класса
C++ Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
Вызов конструктора базового класса из класса-наследника C++
Явное создание экземпляра класса и явная специализация шаблона класса C++
C++ Создание нового экземпляра дочернего класса из экземпляра базового
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Red Planet
 Аватар для 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(); // очистка памяти.
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 12:33     Сложение экземпляра базового класса и экземпляра наследника #22
Погодите, а зачем её вообще очищать? У нас же динамическая память вообще не используется, мы просто выставляем указатель на некоторый объект. Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
14.04.2011, 21:46  [ТС]     Сложение экземпляра базового класса и экземпляра наследника #23
Цитата Сообщение от silent_1991 Посмотреть сообщение
Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
В моей задаче такого в принципе не может быть, но скажите все равно. На будущее.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 21:50     Сложение экземпляра базового класса и экземпляра наследника #24
Можно, например, хранить в B не один указатель, а два - один на объект, от которого порождён данный, а второй на объект, который был порождён данным. Тогда в деструкторе B обязательно надо проходить по указателю на детя и обнулять в нём указатель на себя - нулевой указатель будет являться индикатором, что объект более не существует (или же никогда и не существовал). В случае, если один объект может породить множество других, следует хранить массив указателей на детей, и в деструкторе проходить по всем элементам массива и обнулять указатели на себя.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
14.04.2011, 23:07     Сложение экземпляра базового класса и экземпляра наследника #25
Цитата Сообщение от Red Planet Посмотреть сообщение
В моей задаче такого в принципе не может быть,
а мы вообше не знаем ТВОЮ задачу
Цитата Сообщение от silent_1991 Посмотреть сообщение
хранить в B не один указатель, а два - один на объект, от которого порождён данный,
с какого перепугу он будет знать от кого он рожденный(наследование)????
Цитата Сообщение от silent_1991 Посмотреть сообщение
второй на объект, который был порождён данным
\
а это тем более
наследование идет на уровне написания программы(компиляциии) а не на уровне исполнения
еще раз повторю
Цитата Сообщение от ValeryS Посмотреть сообщение
родитель ничего не знает о наследнике
наследник о родителе знает все
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 23:10     Сложение экземпляра базового класса и экземпляра наследника #26
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать, а уж потом крутить пальцем у виска (если, конечно, останется необходимость). Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
14.04.2011, 23:23     Сложение экземпляра базового класса и экземпляра наследника #27
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать,
Re: Сложение экземпляра базового класса и экземпляра наследника
и что я дожен читать????
Я тебе сказал что это не реально!
наоборот можно.
Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
это ваши проблемы используя известные термины вкладывать свой смысл
и на ваш вопрос я ответил в 17 посте
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 23:30     Сложение экземпляра базового класса и экземпляра наследника #28
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и что я дожен читать????
Например, это: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
Я тебе сказал что это не реально! наоборот можно.
Не знаю, у меня как-то получилось: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
это ваши проблемы используя известные термины вкладывать свой смысл
Да нет, у меня как раз никаких проблем нету.
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и на ваш вопрос я ответил в 17 посте
Вопросов у меня не было вообще.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
14.04.2011, 23:35     Сложение экземпляра базового класса и экземпляра наследника #29
ну тады все

Добавлено через 2 минуты
Мне нравятся ссылки на меня самого
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2011, 23:36     Сложение экземпляра базового класса и экземпляра наследника
Еще ссылки по теме:

C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Передача свойства одного экземпляра класса другому экземпляру класса C++
Создание базового класса и наследника C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.04.2011, 23:36     Сложение экземпляра базового класса и экземпляра наследника #30
ValeryS, ссылки я давал на себя, сообщение, на которое даётся ссылка, выравнивается по верхнему краю.
Yandex
Объявления
14.04.2011, 23:36     Сложение экземпляра базового класса и экземпляра наследника
Ответ Создать тему
Опции темы

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