Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как я могу конвертировать типы в C++?
Я использую две разные библиотеки в своем проекте, и оба они предоставляют базовый прямоугольник struct . Проблема в том, что, похоже, нет способа вставить преобразование между типами, поэтому я не могу вызвать функцию в одной библиотеке с результатом функции в другой. Если бы я был автором любого из них, я мог бы создать преобразования, извне, я не могу.
библиотека а:
typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;
библиотека б:
class Rect {
int x; int y; int width; int height;
/* ... */
};
Теперь я не могу сделать конвертер class, потому что C++ будет искать преобразование только за один шаг. Это, вероятно, хорошо, потому что было бы много возможностей, связанных с созданием новых объектов всех типов.
Я не могу сделать оператор, который берет struct из a и поставляет объект class из b :
foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function
Итак, есть ли разумный способ обойти это?
редактировать:
Возможно, я должен также указать, что мне действительно нужно какое-то решение, которое делает работу с результатом бесшовной, поскольку я не ожидаю, что буду этим кодером. (Хотя я согласен, старая школа, явное обращение было бы хорошим выбором. Другая ветвь, reinterpret_cast имеет ту же проблему..)
edit2:
На самом деле, ни одно из предложений не отвечает на мой фактический вопрос, Конрад Рудольф , кажется, прав. C++ на самом деле не может этого сделать. Отстой, но это правда. (Если это имеет какое-то значение, я собираюсь попробовать подклассы, как предложено CodingTheWheel .
Создайте промежуточную оболочку типа " RectangleEx " и определите пользовательские преобразования в/из сторонних типов строк. Всякий раз, когда вы говорите с любым из API, делайте это через класс shim.
Другим способом было бы получить class либо из rect , либо из Rectangle и вставить туда преобразования/конструкторы.
Не знаю, насколько это разумно, но как насчет чего-то вроде этого:
class R
{
public:
R(const rectangle& r) { ... };
R(const Rect& r) { ... };
operator rectangle() const { return ...; }
operator Rect() const { return ...; }
private:
...
};
Тогда вы можете просто обернуть каждый rectangle в R() , и произойдет "right thing".
В вашем случае это может быть неосуществимо, но я видел, как люди используют небольшой препроцессор-фу, чтобы массажировать типы В совместимость.
Даже это предполагает, что вы создаете одну или обе библиотеки.
Также возможно, что вы вообще не хотите этого делать, но хотите повторно принять какое-то раннее решение. Или нет.
Если бы struct s были такими же внутренне, вы могли бы сделать reinterpret_cast ; однако, поскольку похоже, что у вас есть 16-битные и 32-битные поля, вы, вероятно, застряли в преобразовании при каждом вызове или написании оболочек для всех функций одной из библиотек.
Почему бы не сделать что-то простое, как это: (обратите внимание, что это может/вероятно, не будет компилироваться), но вы получите идею...
private Rect* convert(const rectangle& src)
{
return new Rect(src.x,src.y,src.w,src.h);
}
int main()
{
rectangle r;
r.x = 1;
r.y = 2;
r.w = 3;
r.h = 4;
Rect* foo = convert(&r);
...
delete foo;
}
EDIT: похоже, у нас с Коко есть одна и та же идея.
Может быть, вы могли бы попробовать это с перегрузкой оператора ? (Может быть, оператор a=, который не является методом вашего класса) ?
Оператор Rect= (const Rect&,const rectangle&)
Подробнее об этом на языке программирования C++ от Bjarne Stroustrup или, возможно, на этой странице: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html