Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Red Planet
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
1

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

11.04.2011, 23:15. Просмотров 2397. Ответов 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
Ответы с готовыми решениями:

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

Создание экземпляра для наследника абстрактного класса
Есть абстрактный базовый класс: class Base { public: int variable;...

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

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

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? ...

29
Red Planet
49 / 10 / 3
Регистрация: 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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.04.2011, 12:33 22
Погодите, а зачем её вообще очищать? У нас же динамическая память вообще не используется, мы просто выставляем указатель на некоторый объект. Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
0
Red Planet
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
14.04.2011, 21:46  [ТС] 23
Цитата Сообщение от silent_1991 Посмотреть сообщение
Единственное, что тут может быть ситуация, когда объект-родитель (один из операндов сложения) уничтожится, а объект-сын останется, тогда указатель в нём станет невалидным. Но это другой разговор, как это поддерживать.
В моей задаче такого в принципе не может быть, но скажите все равно. На будущее.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.04.2011, 21:50 24
Можно, например, хранить в B не один указатель, а два - один на объект, от которого порождён данный, а второй на объект, который был порождён данным. Тогда в деструкторе B обязательно надо проходить по указателю на детя и обнулять в нём указатель на себя - нулевой указатель будет являться индикатором, что объект более не существует (или же никогда и не существовал). В случае, если один объект может породить множество других, следует хранить массив указателей на детей, и в деструкторе проходить по всем элементам массива и обнулять указатели на себя.
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
14.04.2011, 23:07 25
Цитата Сообщение от Red Planet Посмотреть сообщение
В моей задаче такого в принципе не может быть,
а мы вообше не знаем ТВОЮ задачу
Цитата Сообщение от silent_1991 Посмотреть сообщение
хранить в B не один указатель, а два - один на объект, от которого порождён данный,
с какого перепугу он будет знать от кого он рожденный(наследование)????
Цитата Сообщение от silent_1991 Посмотреть сообщение
второй на объект, который был порождён данным
\
а это тем более
наследование идет на уровне написания программы(компиляциии) а не на уровне исполнения
еще раз повторю
Цитата Сообщение от ValeryS Посмотреть сообщение
родитель ничего не знает о наследнике
наследник о родителе знает все
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.04.2011, 23:10 26
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать, а уж потом крутить пальцем у виска (если, конечно, останется необходимость). Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
14.04.2011, 23:23 27
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, вам бы тему следовало всё-таки повнимательнее прочитать,
Re: Сложение экземпляра базового класса и экземпляра наследника
и что я дожен читать????
Я тебе сказал что это не реально!
наоборот можно.
Используя термины "родитель" и "ребёнок", я говорю не о наследовании, а о том, что в данной задаче родителем является объект-операнд операции сложения, в результате его сложения с другим объектом появляется ребёнок, который должен знать, от кого "родился".
это ваши проблемы используя известные термины вкладывать свой смысл
и на ваш вопрос я ответил в 17 посте
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
14.04.2011, 23:30 28
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и что я дожен читать????
Например, это: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
Я тебе сказал что это не реально! наоборот можно.
Не знаю, у меня как-то получилось: Сложение экземпляра базового класса и экземпляра наследника
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
это ваши проблемы используя известные термины вкладывать свой смысл
Да нет, у меня как раз никаких проблем нету.
Цитата Сообщение от 'ValeryS' Посмотреть сообщение
и на ваш вопрос я ответил в 17 посте
Вопросов у меня не было вообще.
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
14.04.2011, 23:35 29
ну тады все

Добавлено через 2 минуты
Мне нравятся ссылки на меня самого
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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

Создание базового класса и наследника
в данной программе , попросили добавить в void main ///camera obj//// и...

Указатель типа базового класса на тип наследника
Встретил примерно такое: // Example program #include &lt;iostream&gt; #include...

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


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

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

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