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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
PlayerDark
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 62
#1

Совместимость типов - C++

02.12.2009, 21:24. Просмотров 1147. Ответов 5
Метки нет (Все метки)

Если я использую две разных библиотеки, в каждой из которых определен свой класс Vector3d(трехмерный вектор), то как мне организовать общий интерфейс между ними, тк эти два класса во многом схожи, но не являются совместимыми ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2009, 21:24     Совместимость типов
Посмотрите здесь:

C++ Не совместимость типа
C++ Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.
C++ Приведение типов
C++ Иерархия типов
Несовместимость типов C++
C++ преобразование типов в с++
C++ C++, UTF-8 и совместимость
Совместимость программы C++
Приведение типов C++
C++ Система типов
C++ Как проверить совместимость типов в VC++ ?
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PlayerDark
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 62
04.12.2009, 17:36  [ТС]     Совместимость типов #2
Тема актуальна.
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
04.12.2009, 18:00     Совместимость типов #3
Зависит от того, что ты понимаешь под "общим интерфейсом". Решения могут быть разными - от элементарного преобразующего конструктора до реализации паттерна Wrapper через абстрактный интерфейс.
PlayerDark
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 62
04.12.2009, 19:54  [ТС]     Совместимость типов #4
Мне нужен универсальный интерфейс для работы с такими классами. Я не ознакомлен с данной темой и поэтому не в курсе. Если есть какой нибудь материал или примеры выложите ссылку плз.
Про реализацию по подробнее пожалуйста.

PS в гугл не посылать.
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
05.12.2009, 00:02     Совместимость типов #5
Если вместо "общий интерфейс" сказать "универсальный интерфейс", это много информации не добавит. Доступны ли исходники библиотек? Возможно ли их совместное использование (т.е. не возникает ли конфликта имён)? Подойдёт ли возможность использовать один из этих классов в качестве основного? Содержит ли другой класс достаточно информации для создания основного?
Если ответ на все вопросы утвердительный, то можно использовать преобразующий конструктор. Допустим, ты хочешь иметь возможность неявно превращать объекты типа Vector3dF в Vector3dD:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Vector3dF{
public:
    Vector3dF(float x, float y, float z): X(x), y(Y), Z(z) {}
    float Len() const {return sqrt(X*X + Y*Y + Z*Z);}
    float X, Y, Z;
};
 
class Vector3dD{
public:
    Vector3dD(double x, double y, double z): X(x), y(Y), Z(z) {}
    double Len() const {return sqrt(X*X + Y*Y + Z*Z);}
    double X, Y, Z;
    // Преобразующий конструктор
    Vector3dD(const Vector3dF &vec): X(vec.X), Y(vec.Y), Z(vec.Z) {}
};
С таким конструктором ты можешь смело подставлять значения типа Vector3dF в места, где требуется Vector3dD:
C++
1
2
3
4
5
6
7
Vector3dD Neg(Vector3dD vec)
{
    return Vector3dD(-vec.X, -vec.Y, -vec.Z);
}
 
Vector3dF vf(1.2f, 1.4f, 1.6f);
Vector3dD vd = Neg(vf);
Во втором случае создаёшь класс-интерфейс Vector3d, с которым и будешь работать через виртуальные функции:
C++
1
2
3
4
5
class Vector3d{
public:
    virtual double Len() const = 0;
    virtual ~Vector3d() {};
};
. Потом создаёшь потомки, которые содержат ссылки или экземпляры Vector3dF и Vector3dD и реализуют заданный интерфейс, просто обращаясь к соответствующим функциям. Они тоже могут использовать порождающие конструкторы, а обращаться к Vector3d надо будет по указателям или по ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class WrapperF: public Vector3d {
public:
    WrapperF(const Vector3dF &src): vec(src) {}
    virtual double Len() const {return vec.Len();}
private:
    Vector3dF vec;
};
 
class WrapperD: public Vector3d {
public:
    WrapperD(const Vector3dD &src): vec(src) {}
    virtual double Len() const {return vec.Len();}
private:
    Vector3dD vec;
};
 
double NegLen(const Vector3d& vec)
{
    return -vec.Len();
}
 
Vector3dF vf(1.2f, 1.4f, 1.6f);
const double nl = NegLen(WrapperF(vf));
PlayerDark
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 62
05.12.2009, 14:30  [ТС]     Совместимость типов #6
Насчет первого случая, я так понимаю при передачи вектора в функцию, принимающую векторы другого типа, будет создан экземпляр нужного вектора и после использования сразу удален ?
Yandex
Объявления
05.12.2009, 14:30     Совместимость типов
Ответ Создать тему
Опции темы

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