Domanda

Ho una lista di parti e alcuni di loro bisogno di un puntatore ad un motore, permette di chiamarli EngineParts. Quello che voglio è quello di trovare queste EngineParts utilizzando RTTI e poi dare loro il motore.

Il problema è come progettare l'EnginePart. Ho due opzioni qui, di seguito descritte, e non so quale scegliere. Opzione 1 è più veloce perché non ha una funzione virtuale. L'opzione 2 è più facile se voglio clone () l'oggetto perché senza dati non ha bisogno di una funzione Clone ().

Qualche idea? Forse c'è una terza opzione?

Opzione 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
}

Opzione 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
}

(Si noti che la situazione attuale è un po 'più complicato, non posso utilizzare una soluzione semplice come la creazione di un elenco separato per EngineParts)

Grazie

È stato utile?

Soluzione 2

Peccato che la risposta affermando che 'una parte non può tenere il motore' è stato cancellato perché era in realtà la soluzione.

Dal momento che è necessario non il motore completo, ho trovato una terza via:


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)
}

A causa GetSomeValue () ha bisogno di un paio di params cui motore non può sapere, non c'è modo si potrebbe "iniettare" questo valore come il puntatore del motore è stato iniettato in opzione 1 e 2. (Beh .. a meno che anche fornire un getparams virtuali ()).

Questo nasconde il motore dalla frizione e mi dà praticamente solo un modo per codificare esso.

Altri suggerimenti

Le funzioni virtuali in compilatori moderni (da circa negli ultimi 10 anni) sono molto veloci, soprattutto per gli obiettivi di macchine desktop, e che la velocità non dovrebbe influenzare il vostro disegno.

È ancora bisogno di un metodo clone a prescindere, se si desidera copiare da una base di riferimento da pointer- /, come si deve consentire (sconosciuta in questo momento), classi derivate di copiare se stessi, compresi i dettagli di implementazione come puntatori vtable . (Anche se vi limitate a un compilatore / implementazione, è possibile prendere scorciatoie basati su di esso, e solo rivalutare quelli ogni volta che si desidera utilizzare un altro compilatore o vuole aggiornare il compilatore.)

che si sbarazza di tutti i criteri che hai elencato, quindi sei di nuovo di non saper scegliere. Ma questo è facile: scegliere quello che è più semplice da fare per voi. (Il che vale a dire, non posso dire sulla base di questo esempio made-up, ma ho il sospetto che sia la prima.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top