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

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

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

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

11.04.2011, 23:15. Просмотров 2255. Ответов 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
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.04.2011, 23:38 #2
Не совсем понятно, вам это было нужно:
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
#include <iostream>
 
class A
{
public:
    A(int a = 0):
    _a(a)
    {
    }
 
   int get_a() const
   {
       return _a;
   }
 
   void set_a(int a)
   {
       _a = a;
   }
 
private:
    int _a;
};
 
class B: public A
{
public:
    B(int a = 0, int b = 0):
    _b(b)
    {
        set_a(a);
    }
 
    int get_b() const
    {
        return _b;
    }
 
    void set_b(int b)
    {
        _b = b;
    }
 
private:
    int _b;
};
 
B operator+(const A &left, const B &right)
{
    return B (left.get_a() + right.get_a(), right.get_b());
}
 
int main()
{
    A a(10);
    B b(15, 5);
    B c = a + b;
    
    std::cout << c.get_a() << "\t" << c.get_b() << std::endl;
 
    return 0;
}
Или я не понял задание?
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 12:59  [ТС] #3
silent_1991, там вся загвоздка с динамической памятью для prev.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 14:49 #4
Red Planet, а что конкретно собой представляет ваш класс? Зачем там указатель prev? На что он указывает и почему вся загвоздка в нём? Из первого поста не совсем понятно.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 19:00  [ТС] #5
silent_1991, смотрите. Есть объект класса A, у него есть наследник B. Нужно реализовать операцию сложения экземпляра родителя с экземпляром наследника. В результате этого получается экземпляр наследника.

C++
1
2
A a1; B b1, res;
res=b1+a1;
Цитата Сообщение от silent_1991 Посмотреть сообщение
Зачем там указатель prev?
Этому указателю (res.prev) присваивается адрес b1 (так как скаладываем b1 с a1). Таким образом res "знает", что появился от b1.

Цитата Сообщение от silent_1991 Посмотреть сообщение
почему вся загвоздка в нём?
Нужно аккуратно и правильно обращаться с динамической памятью, но я пока не сообразил, поэтому и создал тему.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 19:05 #6
Прошу прощения за нескромны вопрос, а с какой целью результату сложения нужно обязательно знать о том, от кого он получился? Расскажите, что вы пытаетесь в общем сделать (что вообще за класс будет)? Возможно, вы пытаетесь удалить гланды через одно известное место, и всё можно сделать гораздо проще, но для этого надо знать, в чём заключается суть задания.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 20:02  [ТС] #7
Суть задания в следующем. Есть задача, решается методом динамического программирования. Немного похожа на задачу о рюкзаке. Каждый предмет обладает массой и стоимостью. Сделал набросок, думаю, что так будет проще.

Предмет представлен классом A.
C++
1
2
3
4
class A {
 protected: double x, y;
// далее следуют методы класса //
}
Набор предметов хранится в векторе без указателя prev - набору методов он незачем, только память лишнюю занимать будет.

Но когда идет пошаговое принятие решений, то тут уже нужен prev (см. на рисунке). А для того чтобы сложить предмет из набора предметов с точкой на вертикали нужна операция сложения экземпляра B с экземпляром A (точки на вертикали с элементом из вектора, соответственно).
0
Миниатюры
Сложение экземпляра базового класса и экземпляра наследника  
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 20:07 #8
Red Planet, ну тогда, судя по всему, действительно нужно хранить указатель (или просто копию). Но и в этом случае никаких проблем со сложением я не вижу.
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
12.04.2011, 20:45 #9
э... Прошу прощения, может я чего недопонимаю... Не проверить ли синтаксис? Строки 29 и 37 в частности.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 20:50 #10
kravam, а что вам там так не понравилось?
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
12.04.2011, 20:56 #11
Копилятору моему. Он говорит, что нельзя одну и ту же функцию два раза определять...
1
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 20:58 #12
kravam, да, действительно, правильно говорит))) Я даже не заметил, ибо в код особо не вглядывался. Прошу прощения за сомнения.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
12.04.2011, 21:00 #13
родитель ничего не знает о наследнике
наследник о родителе знает все
может перопределить задачу складывать наследника с базовым классом(или с любым наследником приведенным к базовому)
судя по картинке ты не понимаешь принцип наследования
если объект наследник появился на след у него будет какой то адрес
этот адрес не изменится приводи ты его к родителю деду или к самому себе
и не надо никаких prev адрес этот this
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.04.2011, 21:05 #14
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника. Здесь, судя по всему, фишка в том, что этот третий объект должен знать о его папе, не в смысле наследования, а в смысле того, что в качестве его папы выступал такой же экземпляр дочернего класса, как и сам получившийся ребёнок. Т.е. у "сыночка" должен быть на "листочке" записан адресок "папаши" (при этом всём забываем, что такие же термины используются в наследовании - нам сейчас важна область "генов"). Уж простите за последнюю метафору)))
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
12.04.2011, 21:10 #15
например можно так
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
class A
{
double x,y;
virtual A* Add( A *a)=0;
}
class B :public A
{
virtual A* Add( A *a)
     {  this->x+=a->x;
         this->y+=a->y;
         return (A*)this;
      }:
}
 
class C :public A
{
virtual A* Add( A *a)
     {  this->x+=a->x;
         this->y+=a->y;
         return (A*)this;
      }:
}
 
B b;
C c;
c.Add(&b);
c.Add(&c);
b.Add(&b);
b.Add(&c);
}
писал на коленке возможны ошибки
0
12.04.2011, 21:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2011, 21:10
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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