Форум программистов, компьютерный форум 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++ Создание нового экземпляра дочернего класса из экземпляра базового
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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;
}
Или я не понял задание?
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 12:59  [ТС]     Сложение экземпляра базового класса и экземпляра наследника #3
silent_1991, там вся загвоздка с динамической памятью для prev.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 14:49     Сложение экземпляра базового класса и экземпляра наследника #4
Red Planet, а что конкретно собой представляет ваш класс? Зачем там указатель prev? На что он указывает и почему вся загвоздка в нём? Из первого поста не совсем понятно.
Red Planet
 Аватар для 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 Посмотреть сообщение
почему вся загвоздка в нём?
Нужно аккуратно и правильно обращаться с динамической памятью, но я пока не сообразил, поэтому и создал тему.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 19:05     Сложение экземпляра базового класса и экземпляра наследника #6
Прошу прощения за нескромны вопрос, а с какой целью результату сложения нужно обязательно знать о том, от кого он получился? Расскажите, что вы пытаетесь в общем сделать (что вообще за класс будет)? Возможно, вы пытаетесь удалить гланды через одно известное место, и всё можно сделать гораздо проще, но для этого надо знать, в чём заключается суть задания.
Red Planet
 Аватар для 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 (точки на вертикали с элементом из вектора, соответственно).
Миниатюры
Сложение экземпляра базового класса и экземпляра наследника  
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 20:07     Сложение экземпляра базового класса и экземпляра наследника #8
Red Planet, ну тогда, судя по всему, действительно нужно хранить указатель (или просто копию). Но и в этом случае никаких проблем со сложением я не вижу.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.04.2011, 20:45     Сложение экземпляра базового класса и экземпляра наследника #9
э... Прошу прощения, может я чего недопонимаю... Не проверить ли синтаксис? Строки 29 и 37 в частности.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 20:50     Сложение экземпляра базового класса и экземпляра наследника #10
kravam, а что вам там так не понравилось?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.04.2011, 20:56     Сложение экземпляра базового класса и экземпляра наследника #11
Копилятору моему. Он говорит, что нельзя одну и ту же функцию два раза определять...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 20:58     Сложение экземпляра базового класса и экземпляра наследника #12
kravam, да, действительно, правильно говорит))) Я даже не заметил, ибо в код особо не вглядывался. Прошу прощения за сомнения.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
12.04.2011, 21:00     Сложение экземпляра базового класса и экземпляра наследника #13
родитель ничего не знает о наследнике
наследник о родителе знает все
может перопределить задачу складывать наследника с базовым классом(или с любым наследником приведенным к базовому)
судя по картинке ты не понимаешь принцип наследования
если объект наследник появился на след у него будет какой то адрес
этот адрес не изменится приводи ты его к родителю деду или к самому себе
и не надо никаких prev адрес этот this
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 21:05     Сложение экземпляра базового класса и экземпляра наследника #14
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника. Здесь, судя по всему, фишка в том, что этот третий объект должен знать о его папе, не в смысле наследования, а в смысле того, что в качестве его папы выступал такой же экземпляр дочернего класса, как и сам получившийся ребёнок. Т.е. у "сыночка" должен быть на "листочке" записан адресок "папаши" (при этом всём забываем, что такие же термины используются в наследовании - нам сейчас важна область "генов"). Уж простите за последнюю метафору)))
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
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);
}
писал на коленке возможны ошибки
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 21:14  [ТС]     Сложение экземпляра базового класса и экземпляра наследника #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника. Здесь, судя по всему, фишка в том, что этот третий объект должен знать о его папе, не в смысле наследования, а в смысле того, что в качестве его папы выступал такой же экземпляр дочернего класса, как и сам получившийся ребёнок. Т.е. у "сыночка" должен быть на "листочке" записан адресок "папаши" (при этом всём забываем, что такие же термины используются в наследовании - нам сейчас важна область "генов"). Уж простите за последнюю метафору)))
Именно это я имел в виду!

ValeryS, проверю завтра.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
12.04.2011, 21:15     Сложение экземпляра базового класса и экземпляра наследника #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
ValeryS, я полагаю, имелось ввиду следующее. При сложении объектов родительского и дочернего класса получается новый, третий объект - экземпляр наследника
ну тогда еще проще
создаем базовый класс
от него создаем класс родителя
и класс ребенка(можно тот же самый)
в классе указатель на два базовых класса (это будут родители)
при сложении просто присваиваем значения объектов родителей этим указателям.
(этак ведь можно и дерево создать )
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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;
}
Red Planet
 Аватар для Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
12.04.2011, 22:05  [ТС]     Сложение экземпляра базового класса и экземпляра наследника #19
silent_1991, а зачем вы "_" ставите перед вызовами функций и именами переменных? Это под .NET?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2011, 22:07     Сложение экземпляра базового класса и экземпляра наследника
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.04.2011, 22:07     Сложение экземпляра базового класса и экземпляра наследника #20
Red Planet, нет, это просто один из стилей программирования. _ - всего навсего часть имени. И перед вызовами функций я не ставлю _. Я так именую только закрытые переменные-члены.
Yandex
Объявления
12.04.2011, 22:07     Сложение экземпляра базового класса и экземпляра наследника
Ответ Создать тему
Опции темы

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