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

Преобразование классов одной иерархии - C++

Восстановить пароль Регистрация
 
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.12.2014, 17:01     Преобразование классов одной иерархии #1
Всем привет.

Допустим, есть следующая иерархия классов:
C++
1
2
3
4
5
6
7
8
9
10
11
class B {
   T data;
};
 
class D1 : public B {
  // some D1 spec methods & data
};
 
class D2: public B {
  // some D2 spec methods & data
};
Требуется реализовать метод конвертации D1 <-> D2.
В обе стороны для более общего случая, но можно ограничиться и односторонним преобразованием.

Хочется сделать это элегантно. На текущий момент для рассмотрения есть такие варианты:
1. Сделать свободную функцию (семейство).
2. Добавить в D1 конструктор, принимающий D2 и наоборот.
3. Добавить в D1 метод makeD2. И симметричный в D2.

При вариантах 2,3 придется сделать классы дружественными друг другу, в варианте 1 - добавить дружественную функцию в оба класса.

Была мысль сделать метод доступа к данным в базовом классе protected, но это всё равно не позволит получить доступ в D1 к базовой части, которая содержится в D2.

С одной стороны хотелось бы избавиться от дружественности, с другой - не хочется городить лишних методов доступа.

Если у кого есть идеи на счет реализации подобной конвертации буду рад их услышать.

Заранее спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2014, 17:01     Преобразование классов одной иерархии
Посмотрите здесь:

Visual C++ Разработка иерархии классов
C++ указатель на void в иерархии классов. можно ли так делать?
C++ Взаимодействие между объектами единой иерархии классов
организация разветвленной иерархии классов C++
Не могу написать код для иерархии классов C++
C++ Связанный список для иерархии классов
Цепочка иерархии классов C++
C++ Реализ иерархии классов и соответствующих им методов!
C++ Затрудние в названии иерархии классов
Создание иерархии классов C++
Сохранить в одной коллекции несколько объектов классов одной ветви иерархии C++
C++ Найти ошибку в иерархии пользовательских классов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
25.12.2014, 20:49     Преобразование классов одной иерархии #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
class B {
    T data;
 
public:
    B() : data() {}
    B(const B& b) : data(b.data) {}
};
 
class D1 : public B {
  // some D1 spec methods & data
public:
    D1() {}
    D1(const B& b) : B(b) {}
};
 
class D2: public B {
  // some D2 spec methods & data
public:
    D2() {}
    D2(const B& b) : B(b){}
};
 
int main()
{
    D1 d1;
    D2 d2(d1);
    d1 = d2;
}
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.12.2014, 22:44  [ТС]     Преобразование классов одной иерархии #3
retmas, почти оно. Немного подправил:
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
class B {
    T data;
public:
    B() : data() {}
    B(const B& b) : data(b.data) {}
};
 
class D2;
 
class D1 : public B {
  // some D1 spec methods & data
public:
    D1() {}
    D1(const D2& d);
};
 
class D2: public B {
  // some D2 spec methods & data
public:
    D2() {}
    D2(const D1& d) : B(d) {
        // convert D1 spec data
    }
};
 
D1::D1(const D2& d) : B(d) {
    // convert D2 spec data
} 
 
int main()
{
    D1 d1;
    D2 d2(d1);
    d1 = d2;
}
Yandex
Объявления
25.12.2014, 22:44     Преобразование классов одной иерархии
Ответ Создать тему
Опции темы

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