Pregunta

Estoy usando dos bibliotecas diferentes en mi proyecto y ambas proporcionan un rectángulo básico. struct.El problema con esto es que parece no haber manera de insertar una conversión entre los tipos, por lo que no puedo llamar a una función en una biblioteca con el resultado de una función en la otra.Si yo fuera el autor de cualquiera de estos, podría crear conversiones, desde fuera, no puedo.

biblioteca a:

typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;

biblioteca b:

class Rect {
  int x; int y; int width; int height;
  /* ... */
};

Ahora no puedo hacer un convertidor. class, porque C++ solo buscará una conversión en un paso.Probablemente esto sea algo bueno, porque habría muchas posibilidades relacionadas con la creación de nuevos objetos de todo tipo.

No puedo crear un operador que tome el struct de a y suministra un objeto del class de b:

foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function

Entonces, ¿hay alguna forma sensata de evitar esto?

editar:

Quizás también debería señalar que realmente me gustaría alguna solución que haga que trabajar con el resultado sea fluido, ya que no espero ser ese codificador.(Aunque estoy de acuerdo, la conversión explícita y de la vieja escuela habría sido una buena opción.La otra rama, reinterpret_cast tiene el mismo problema..)

editar2:

En realidad, ninguna de las sugerencias responde realmente a mi pregunta real. Konrad Rudolph parece ser correcto.C++ en realidad no puede hacer esto.Apesta, pero es cierto.(Si hay alguna diferencia, intentaré crear subclases como lo sugiere CodificaciónLaRueda.

¿Fue útil?

Solución

Si no puede modificar las estructuras, entonces no tiene otra alternativa que escribir una función de conversión manual porque la sobrecarga de operadores de conversión solo funciona dentro del cuerpo de la clase.No hay otra manera.

Otros consejos

Crear un tipo de cuña intermedia "RectangleEx" y definir conversiones personalizadas hacia/desde tipos de cadenas de terceros.Siempre que hable con cualquiera de las API, hágalo a través de la clase shim.

Otra forma sería derivar una class desde cualquiera rect o Rectangle, e inserte conversiones/constructores allí.

No estoy seguro de qué tan sensato sea esto, pero ¿qué tal algo como esto?

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

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

private:
    ...
};

Entonces puedes simplemente envolver cada rectangle en R() y sucederá "lo correcto".

Puede que no sea factible en su caso, pero he visto personas que emplean un pequeño preprocesador-foo para hacer que los tipos sean compatibles.

Incluso esto supone que está creando una o ambas bibliotecas.

También es posible que no quieras hacer esto en absoluto, pero quieras reevaluar alguna decisión temprana.O no.

¿Por qué no algo tan simple como esto?(tenga en cuenta que esto puede/probablemente no se compilará) pero ya entiende la idea...


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;

}

EDITAR: Parece de koko y tengo la misma idea.

Si el structs eran los mismos internamente, podrías hacer un reinterpret_cast;sin embargo, dado que parece que tiene campos de 16 bits frente a 32 bits, probablemente esté atascado al convertir en cada llamada o escribir contenedores para todas las funciones de una de las bibliotecas.

¿Quizás podrías probarlo con la sobrecarga del operador?(¿Quizás un operador = que no es un método de su clase)?

Operador Rect= (const Rect&,const rectángulo&)

Más sobre esto en el lenguaje de programación C++ de Bjarne Stroustrup o tal vez en esta página: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top