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.

¿Cómo saber si un tipo genérico T tiene un constructor adecuado para su uso?

Estoy implementando una lista doblemente enlazada que tiene nodos centinelas como cabeza y cola, digamos que esta clase se llama “List”. “Node” es una estructura privada dentro de “List”. Esta clase tiene un método privado “Init” para inicializar los nodos de la cabeza y la cola, que se invoca en los constructores de “List”.

template<typename t="">
class List {
public:
    List() {
        Init();
    }
    ...

private:
    struct Node {
        T data;
        Node* prev;
        Node* next;

        // Constructores
    };

    size_t size;
    Node* head;
    Node* tail;

    void Init() {
        // Los códigos generan un problema si las instancias de T no tienen un constructor predeterminado.
        head = new Node;
        tail = new Node;
        head->prev = nullptr;
        head->next = tail;
        tail->prev = head;
        tail->next = nullptr;
        size = 0;
    }
};

Ahora, la pregunta es, si las instancias de “T” no tienen un constructor predeterminado, no puedo crear nodos centinelas utilizando “head = new Node;” y “tail = new Node;”. El operador “new” siempre asigna una parte de memoria y la construye. Al construir el objeto “Node”, debe usar algún constructor de “T” para inicializar el campo “data” en “Node”.

¿Hay alguna manera de inspeccionar qué constructores (excepto los constructores de copia y movimiento) de “T” puedo usar para construir la variable “data” de tipo “T”? ¿O solo puedo inicializar los campos “prev” y “next” en “Node”, dejando el campo “data” sin inicializar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Si las instancias de T no tienen un constructor por defecto, la única forma de construir el campo data en Node es utilizar un constructor de T. Si los constructores de T no se conocen de antemano, la única opción es requerir que un constructor para T se pase al constructor de List. Este constructor puede ser utilizado para construir el campo data en Node. Alternativamente, se puede dejar el campo data sin inicializar y proporcionar un método separado para inicializarlo después de que el objeto Node haya sido construido. Este método puede ser llamado desde el método Init de List.

Comments are closed.