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.

Abstracción de contenedores en C++

Me gustaría tener una clase base virtual (interfaz) que contenga un método que devuelva un objeto iterable (¿un contenedor?). Las clases que la implementen manejarían sus respectivos contenedores, por ejemplo, la clase A lo implementaría como un vector, la clase B como una lista, etc.

Esencialmente, me gustaría hacer algo como esto:

clase Base{
  virtual Container getContainer() = 0;
}

clase A:Base{
  Vector v;
  Container getContainer() {return v;}
}

A a;
Iterator begin = a.getContainer().begin;
Iterator end = a.getContainer().end;

Es decir, el llamador sería responsable de manejar el iterador (llamando, por ejemplo, a las funciones begin y end para la iteración).

Supongo que algo así es posible, pero no puedo averiguar cómo hacerlo. Específicamente, supongo que las clases como vector y list heredan de una interfaz común que define los métodos begin() y end(), pero no puedo averiguar cuál es esa interfaz y cómo manejarla.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible tener una clase virtual base (interfaz) que contenga un método que devuelva un objeto iterable (un contenedor). Las clases implementadoras, como se mencionó anteriormente, manejarían cada uno de sus contenedores ellos mismos. En este caso, podemos definir una interfaz de contenedor que defina los métodos begin() y end(). Luego, podemos hacer que las clases implementadoras implementen esta interfaz y usen sus respectivos contenedores para devolver los objetos iteradores. Aquí hay una implementación de ejemplo:

    “`c++
    class Contenedor {
    public:
    virtual ~Contenedor() {} // Para asegurar la destrucción adecuada de los objetos de la clase derivada
    virtual Iterador begin() = 0;
    virtual Iterador end() = 0;
    };

    class A : public Contenedor {
    Vector v;
    public:
    Iterador begin() { return v.begin(); }
    Iterador end() { return v.end(); }
    };

    A a;
    Iterador begin = a.begin();
    Iterador end = a.end();
    “`

    En este ejemplo, a es un objeto de la clase A que hereda de la interfaz Contenedor. Los métodos begin() y end() de la clase A devuelven los iteradores correspondientes del vector v que contiene. El llamador es responsable de manejar estos iteradores para la iteración, como se muestra en las últimas dos líneas.

    Tenga en cuenta que la interfaz Contenedor no proporciona miembros de datos ni objetos de contenedor reales. Solo define la interfaz de iteración del contenedor que el llamador puede usar para recorrer el contenedor.

Comments are closed.