es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Propagación de dependencias de encabezados de C++ – ¿Cómo limitarla?

Tengo un dilema recurrente al construir una clase en C++. Me gustaría construir la clase sin propagar sus dependencias internas al exterior.

Sé que tengo opciones como:

  1. Usar el idiom pimpl
  2. Usar una declaración adelantada y sólo referenciar o utilizar punteros inteligentes en el encabezado:
// encabezado
class Forwarded;    // No quiero incluir Forwarded.h para no propagarla

class MyNewClass {
private:
   std::unique_ptr<Forwarded> mForwareded;
   void method1UsesForwarded();
   void method2UsesForwarded();
public:
   void doSomeAction();
};
// cpp
#include "Forwarded.h"

void MyNewClass::doSomeAction() {
   method1UsesForwarded();
   method2UsesForwarded();
}

void MyNewClass::method1UsesForwarded() { /* implementación */ }
void MyNewClass::method2UsesForwarded() { /* implementación */ }
  1. Crear otra clase o archivo de ayuda que utilice esos archivos que no quiero propagar aún más.
// encabezado
class MyNewClass {
public:
   void doSomeAction();
};

// cpp
#include "helper.h"

void MyNewClass::doSomeAction() {
    Forwarded f;
    method1UsesForwarded(f);
    method2UsesForwarded(f);
}

// helper.h
#include "Forwarded.h"

void method1UsesForwarded(Forwarded & f);
void method2UsesForwarded(Forwarded & f);

// helper.cpp
#include "helper.h"

void method1UsesForwarded(Forwarded & f) {
    // implementación
}
void method2UsesForwarded(Forwarded & f) {
    // implementación
}

¿Hay alguna otra opción? No me gusta ninguna de las soluciones anteriores porque proporcionan algo de complicación adicional. La mejor opción para mí sería crear Forwarded como un miembro privado normal y de alguna manera no propagarlo aún más 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, si desea ocultar las dependencias internas de una clase en C ++, tiene opciones limitadas. Las tres soluciones presentadas anteriormente son las más comunes, y todas tienen sus pros y sus contras.

    Utilizar el idiom pimpl es una buena solución si desea ocultar los detalles de implementación de una clase, pero puede agregar cierta sobrecarga en términos de asignación y liberación de memoria. También puede complicar el código y hacerlo más difícil de entender.

    Utilizar declaraciones adelantadas y solo hacer referencia o usar punteros inteligentes en el encabezado puede ayudarlo a evitar la inclusión de encabezados que no son necesarios, pero también puede hacer que su código sea más difícil de entender, especialmente para otros desarrolladores que no están familiarizados con la base de código.

    Crear otra clase o archivo auxiliar que utilice las clases que desea ocultar puede ayudarlo a encapsular las dependencias de su clase, pero también puede hacer que su código sea más complicado, especialmente si tiene muchas dependencias.

    Desafortunadamente, no puede crear un miembro privado y no transmitirlo de alguna manera, ya que su definición debe incluirse en el archivo de encabezado de su clase. Por lo tanto, debe elegir la solución que mejor se adapte a sus necesidades y requisitos del proyecto.

Comments are closed.