Сведения о вопросе

Kimsanov

01:26, 27th August, 2020

Теги

c++   oop   types    

Как я могу конвертировать типы в C++?

Просмотров: 517   Ответов: 7

Я использую две разные библиотеки в своем проекте, и оба они предоставляют базовый прямоугольник 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 .



  Сведения об ответе

baggs

00:05, 13th August, 2020

Создайте промежуточную оболочку типа " RectangleEx " и определите пользовательские преобразования в/из сторонних типов строк. Всякий раз, когда вы говорите с любым из API, делайте это через класс shim.

Другим способом было бы получить class либо из rect , либо из Rectangle и вставить туда преобразования/конструкторы.


  Сведения об ответе

PIRLO

13:43, 5th August, 2020

Не знаю, насколько это разумно, но как насчет чего-то вроде этого:

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

Тогда вы можете просто обернуть каждый rectangle в R() , и произойдет "right thing".


  Сведения об ответе

lool

21:41, 19th August, 2020

Если вы не можете изменить структуры, то у вас нет альтернативы написанию функции ручного преобразования, потому что перегрузка операторов преобразования работает только в теле класса. Другого выхода нет.


  Сведения об ответе

ASSembler

18:04, 12th August, 2020

В вашем случае это может быть неосуществимо, но я видел, как люди используют небольшой препроцессор-фу, чтобы массажировать типы В совместимость.

Даже это предполагает, что вы создаете одну или обе библиотеки.

Также возможно, что вы вообще не хотите этого делать, но хотите повторно принять какое-то раннее решение. Или нет.


  Сведения об ответе

dumai

10:59, 16th August, 2020

Если бы struct s были такими же внутренне, вы могли бы сделать reinterpret_cast ; однако, поскольку похоже, что у вас есть 16-битные и 32-битные поля, вы, вероятно, застряли в преобразовании при каждом вызове или написании оболочек для всех функций одной из библиотек.


  Сведения об ответе

PIRLO

10:29, 16th August, 2020

Почему бы не сделать что-то простое, как это: (обратите внимание, что это может/вероятно, не будет компилироваться), но вы получите идею...


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: похоже, у нас с Коко есть одна и та же идея.


  Сведения об ответе

KOMP

07:29, 23rd August, 2020

Может быть, вы могли бы попробовать это с перегрузкой оператора ? (Может быть, оператор a=, который не является методом вашего класса) ?

Оператор Rect= (const Rect&,const rectangle&)

Подробнее об этом на языке программирования C++ от Bjarne Stroustrup или, возможно, на этой странице: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться