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

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

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

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

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

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

Как проверить совместимость типов в VC++ ? - C++
Как проверить совместимость типов в VC++?

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов. - C++
Буду благодарен! Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов - C++
Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов int или float и возвращают...

C++, UTF-8 и совместимость - C++
Имеется некоторая программа (шутка, прога ещё в проекте). Она по сути является одним из кусков системы общения (пишу себе псевдоИИ, но не...

Не совместимость типа - C++
После написания программы программы у меня возникла проблема связанная скорее всего с соответствием типов друг другу, при этом case'2'...

Совместимость программы - C++
Создал маленькую программу и передал ее другу. (У друга windows xp) Когда он ее запустил у него вышла ошибка "путь к...

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

PS в гугл не посылать.
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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));
0
PlayerDark
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 62
05.12.2009, 14:30  [ТС] #6
Насчет первого случая, я так понимаю при передачи вектора в функцию, принимающую векторы другого типа, будет создан экземпляр нужного вектора и после использования сразу удален ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2009, 14:30
Привет! Вот еще темы с ответами:

Совместимость кода Code Composer Studio (CCS) с C/C++ - C++
С преподавателем друг друга не поняли. Как результат, прихожу с честно сделанными в Паскале лабами под занавес года, а он мне встречный...

Приведение типов - C++
Доброго времени суток. Данный кусок кода выделяет целую часть. Потом, вычитая из исходного числа целую часть, получаем дробную. Почему...

Иерархия типов - C++
помогите сделать программу, хотябы дайте пример. Задача. Создать иерархию типов - устройство ввода, устройство вывода, сенсорный...

Приведение типов - C++
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a>b){...}//Условие...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
05.12.2009, 14:30
Ответ Создать тему
Опции темы

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