Pregunta

Tengo una lista de piezas y algunas de ellas necesitan un puntero a un motor, llamémoslas EngineParts.Lo que quiero es encontrar estas EngineParts usando RTTI y luego darles el Engine.

El problema es cómo diseñar EnginePart.Tengo dos opciones aquí, que se describen a continuación, y no sé cuál elegir.La opción 1 es más rápida porque no tiene función virtual.La opción 2 es más fácil si quiero Clonar() el objeto porque sin datos no necesita una función Clonar().

¿Alguna idea?¿Quizás haya una tercera opción?

Opción 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
}

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

(Tenga en cuenta que la situación real es un poco más complicada, no puedo usar una solución simple como crear una lista separada para EngineParts)

Gracias

¿Fue útil?

Solución 2

Es una pena que la respuesta indicando que 'una parte no puede mantener el motor' se elimina debido a que en realidad era la solución.

Dado que se necesita no es el motor completo, he encontrado una tercera vía:


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

Debido GetSomeValue () necesita unos parametros del motor, que no se puede saber, no hay manera de que podría "inyectar" se inyectó este valor como el puntero del motor en la opción 1 y 2. (Bueno .. a menos que también proporcionan una getParams virtuales ()).

Esto oculta el motor del embrague y me da más o menos sólo una manera de codificar la misma.

Otros consejos

Las funciones virtuales en los compiladores modernos (de aproximadamente los últimos 10 años) son muy rápidas, especialmente para máquinas de escritorio, y esa velocidad no debería afectar su diseño.

Independientemente, aún necesita un método de clonación si desea copiar desde un puntero/referencia a base, ya que debe permitir que las clases derivadas (desconocidas en este momento) se copien a sí mismas, incluidos los detalles de implementación como los punteros de vtable.(Aunque si se ciñe a un compilador/implementación, puede tomar atajos basados ​​en él y simplemente volver a evaluarlos cada vez que desee utilizar otro compilador o desee actualizar su compilador).

Eso elimina todos los criterios que has enumerado, por lo que vuelves a no saber elegir.Pero eso es fácil:elige el que te resulte más sencillo de hacer.(Es decir, no puedo decirlo basándose en este ejemplo inventado, pero sospecho que es el primero).

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