10
votes

C ++ Cast Vector Vecteur

class Interface{};

class Foo: public Interface{};

class Bar{
public:
    vector<Interface*> getStuff();
private:
    vector<Foo*> stuff;
};
How do I implement the function getStuff()?

1 commentaires

Notez qu'un problème connexe est que foo ** n'est pas convertible à interface ** et héritage multiple / virtuel pourrait faire la conversion d'un FOO * à une interface non-trivial.


3 Réponses :


27
votes
vector<Interface*> result(stuff.begin(), stuff.end());
return result;

0 commentaires

6
votes

std :: vecteur code> et std :: vecteur code> est différent, et à peu près non liés. Vous ne pouvez pas vous lancer de l'un à l'autre. Mais vous pouvez std :: copier code> ou utiliser le constructeur de la plage itérator comme @grozz dit.

EDIT: H3>

Répondre à votre question dans les commentaires: ils sont différents de la même manière que deux Les classes avec des membres de types compatibles sont différentes. Exemple: P>

Bar& Bar::operator=( const Foo& foo ) {
    ptr1 = foo.ptr0;
    return *this;
}


3 commentaires

Pouvez-vous m'expliquer pourquoi ils sont différents? À mon point de vue sémantiquement tous les "vecteur de ptr_to_inhérité" est aussi un "vecteur de ptr_to_abstract"


Pour que ce véritable vecteur de ptr_to_inhérité devrait hériter du vecteur de ptr_to_abstract, mais std :: vecteur ne sait pas qu'il a besoin de le faire et, par conséquent, ne le fait pas.


@Mat, vous êtes sémantiquement droit, mais la norme C ++ n'a pas pu choisir de mettre en œuvre cela: si vous pensez par exemple d'une classe de modèle FOO qui a des spécialisations différentes de la base et de dérivé, il n'est pas possible que le compilateur de voir Convertir entre FOO et FOO ...



2
votes

J'utilise cela. Ce n'est pas très gentil, mais je pense vite, je pense :) xxx

et vous ne pouvez également renvoyer que référence au vecteur avec cette méthode xxx


1 commentaires

Je pense que c'est un peu dangereux, et cela ne fonctionnera probablement pas si vous avez plusieurs héritages (je ne recommanderais pas de faire cela), mais je suis d'accord que la copie du vecteur est aussi laide (mais plus sûre ...)