Question

J'utilise deux bibliothèques différentes dans mon projet, et toutes deux fournissent un rectangle de base struct.Le problème est qu'il ne semble y avoir aucun moyen d'insérer une conversion entre les types, je ne peux donc pas appeler une fonction dans une bibliothèque avec le résultat d'une fonction dans l'autre.Si j'étais l'auteur de l'un ou l'autre, je pourrais créer des conversions, de l'extérieur, je ne le peux pas.

bibliothèque a :

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

bibliothèque B :

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

Maintenant, je ne peux pas faire de convertisseur class, car C++ ne recherchera une conversion qu'en une seule étape.C'est probablement une bonne chose, car il y aurait de nombreuses possibilités de création de nouveaux objets de toutes sortes.

Je ne peux pas créer un opérateur qui prend le struct depuis a et fournit un objet du class depuis b:

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

Alors, existe-t-il un moyen sensé de contourner ce problème ?

modifier:

Je devrais peut-être aussi souligner que j'aimerais vraiment une solution qui rende le travail avec le résultat transparent, car je ne m'attends pas à être ce codeur.(Même si je suis d’accord, une conversion explicite et à l’ancienne aurait été un bon choix.L'autre branche, reinterpret_cast a le même problème..)

edit2 :

En fait, aucune des suggestions ne répond vraiment à ma vraie question, Konrad Rudolph semble être correct.En fait, C++ ne peut pas faire ça.C'est nul, mais c'est vrai.(Si cela fait une différence, je vais essayer de sous-classer comme suggéré par CodageLaRoue.

Était-ce utile?

La solution

Si vous ne pouvez pas modifier les structures, vous n'avez pas d'autre alternative que d'écrire une fonction de conversion manuelle car la surcharge des opérateurs de conversion ne fonctionne que dans le corps de la classe.Il n'y a pas d'autre chemin.

Autres conseils

Créer une cale intermédiaire de type "RectangleEx" et définissez des conversions personnalisées vers/depuis les types de chaînes tiers.Chaque fois que vous parlez à l'une ou l'autre API, faites-le via la classe shim.

Une autre façon serait de dériver un class de l'un ou l'autre rect ou Rectangle, et insérez-y des conversions/constructeurs.

Je ne sais pas à quel point cela est raisonnable, mais que diriez-vous de quelque chose comme ceci :

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

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

private:
    ...
};

Ensuite, vous pouvez simplement envelopper chaque rectangle dans R() et la « bonne chose » arrivera.

Cela n'est peut-être pas réalisable dans votre cas, mais j'ai vu des gens utiliser un petit préprocesseur-foo pour masser les types jusqu'à ce qu'ils soient compatibles.

Même cela suppose que vous construisez une ou les deux bibliothèques.

Il est également possible que vous ne souhaitiez pas du tout faire cela, mais que vous souhaitiez réévaluer une décision prise tôt.Ou non.

Pourquoi pas quelque chose de simple comme ceci :(notez que cela ne sera peut-être/probablement pas compilé) mais vous voyez l'idée...


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;

}

MODIFIER: On dirait celui de Koko et j'ai la même idée.

Si la structC'était la même chose en interne, vous pourriez faire un reinterpret_cast;cependant, comme il semble que vous ayez des champs 16 bits contre 32 bits, vous êtes probablement bloqué en train de convertir à chaque appel ou d'écrire des wrappers pour toutes les fonctions de l'une des bibliothèques.

Peut-être pourriez-vous l'essayer avec une surcharge d'opérateur ?(Peut-être un opérateur = qui n'est pas une méthode de votre classe) ?

Opérateur Rect= (const Rect&,const rectangle&)

Pour en savoir plus, consultez le langage de programmation C++ de Bjarne Stroustrup ou peut-être sur cette page : http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top