Question

J'ai une liste des parties et certains d'entre eux besoin d'un pointeur vers un moteur, permet de les appeler EngineParts. Ce que je veux est de trouver ces EngineParts en utilisant RTTI et leur donner le moteur.

Le problème est de savoir comment concevoir le EnginePart. J'ai deux options, décrites ci-dessous, et je ne sais pas lequel choisir. L'option 1 est plus rapide car il ne dispose pas d'une fonction virtuelle. L'option 2 est plus facile si je veux clone () l'objet car sans données, il n'a pas besoin d'une fonction clone ().

Toutes les pensées? Peut-être il y a une troisième option?

Option 1:


class Part;

class EnginePart : public Part {
    protected: Engine *engine
    public: void SetEngine(Engine *e) {engine = e}
};

class Clutch : public EnginePart {
    // code that uses this->engine
}

Option 2:


class Part;

class EnginePart : public Part {
    public: virtual void SetEngine(Engine *e)=0;
};

class Clutch : public EnginePart {
    private: Engine *engine;
    public: void SetEngine(Engine *e) { engine = e; }
    // code that uses this->engine
}

(Notez que la situation réelle est un peu plus impliqué, je ne peux pas utiliser une solution simple comme la création d'une liste séparée pour EngineParts)

Merci

Était-ce utile?

La solution 2

Dommage que la réponse indiquant que « une partie ne peut pas tenir le moteur » est supprimé parce que c'était en fait la solution.

Depuis pas le moteur complet est nécessaire, j'ai trouvé une troisième voie:


class Part;

class EngineSettings {
    private:
        Engine *engine
        friend class Engine;
        void SetEngine(Engine *e) {engine = e}
    public:
        Value* GetSomeValue(params) { return engine->GetSomeValue(params); }
};

class Clutch : public Part, public EngineSettings {
    // code that uses GetSomeValue(params) instead of engine->GetSomeValue(params)
}

Parce que GetSomeValue () a besoin de quelques params qui moteur ne peut pas savoir, il n'y a aucun moyen pourrait « injecter » cette valeur comme le pointeur de moteur a été injecté dans l'option 1 et 2. (bien .. moins que je fournisse également un GetParams virtuel ()).

Ce cache le moteur de l'embrayage et me donne à peu près qu'une seule façon de coder.

Autres conseils

Les fonctions virtuelles dans les compilateurs modernes (d'environ 10 ans) sont très rapides, en particulier pour les cibles de machines de bureau, et que la vitesse ne devrait pas affecter votre conception.

Vous avez encore besoin d'une méthode clone quel que soit, si vous voulez copier à partir d'un pointeur- / à base de référence, vous devez prévoir (inconnu à cette époque) les classes dérivées de se copier, y compris les détails de mise en œuvre comme des pointeurs vtable . (Bien que si vous vous en tenez à un compilateur / implémentation, vous pouvez prendre des raccourcis sur la base, et tout simplement réévaluer les chaque fois que vous voulez utiliser un autre compilateur ou si vous voulez mettre à jour votre compilateur.)

qui se débarrasse de tous les critères que vous avez énumérés, vous êtes de retour à ne pas savoir comment choisir. Mais c'est facile: choisir celui qui est le plus simple à faire pour vous. (Ce qui c'est, je ne peux pas dire sur la base de cet exemple maquillé, mais je soupçonne que c'est le premier.)

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