Template

di il
6 risposte

Template

Ciao a tutti, sto scrivendo un codice per creare una matrice dinamica... per far questo ho creato una classe template CArray che permette di allocare in un array dinamico un oggetto qualunque e una classe chiamata ArrayList che consente di allocare dinamicamente degli array di tipo char.
Ecco il codice:
#ifndef CARRAY_H
#define CARRAY_H
#include "../ArrayList.h"

template <typename T>
class CArray
{
     private:
        T *lista = nullptr;
        int n_size = 0;

    public:
        CArray(){
            lista = new T[0];
        };


    void add(T elemento){

        n_size++;

    T *temp = new T[n_size];

        for (int i = 0; i < n_size-1; i++) temp[i] = lista[i];
        temp[n_size-1] = elemento;

        for (int i = 0; i < n_size; i++) lista[i] = temp[i];


    }

    T getElement(int i) {return lista[i];}


};


#endif // CARRAY_H

#ifndef ARRAYLIST_H_INCLUDED
#define ARRAYLIST_H_INCLUDED
#include <conio.h>
#include <iostream>


class ArrayList{

private:
    char *elementi = nullptr;
    int nsize;
    int n_sizelista;


public:
   ArrayList(){

    elementi = new char[0];
    nsize=0;

}
ArrayList copia(ArrayList origine){

    ArrayList *elementi = new ArrayList[origine.getSize()];

    for (int i = 0; i < origine.getSize(); i++) elementi->add(origine.getElement(i));

    return *elementi;
}

    convtoint(char c){    return c - 48;}
convtochar(int i){return i + 48;}

void add(char i){
    nsize++;
    char *temp = new char[nsize];
    for (int j = 0; j < nsize-1; j++) temp[j] = elementi[j];
    temp[nsize-1] = i;
    elementi = new char[nsize];
    for (int j = 0; j < nsize; j++) elementi[j] = temp[j];
    delete[] temp;
}
getSize(){ return nsize;}

void mostra(){

   
    for (int i = 0; i < nsize; i++) putchar(elementi[i]);

}
getElement(int pos){ return elementi[pos]; }

add_testa(char i){
    nsize++;
    char *temp = new char[nsize];
    for (int j = nsize-1; j > 0; j--) temp[j] = elementi[j-1];

    elementi = new char[nsize];
    temp[0] = i;
    for (int j = 0; j < nsize; j++) elementi[j] = temp[j];
    delete[] temp;
}


elimina_ultimo(){

    nsize--;
    char *temp = new char[nsize];
    for (int i = 0; i < nsize; i++) temp[i] = elementi[i];

    elementi = new char[nsize];

    for (int i = 0; i < nsize; i++) elementi[i] = temp[i];

    delete[] temp;
}






};
#include "ArrayList.cpp"

#endif // ARRAYLIST_H_INCLUDED
Nel main()

int main(){

 ArrayList *add1 = new ArrayList();
 add1->add('0');
 add1->add('1');
 add1->add('2');
 CArray<ArrayList> *el_addendi = new CArray<ArrayList>;
 
 
 el_addendi->add(add1);
    
    return 0;
 }
 
 
Il compilatore però dà un errore in el_addendi->add(add1); NO MATCHING FUNCTION FOR CALL 'CArray<ArrayList>::add(ArrayList*&)'

Ho provato a modificarlo in questi due modi: el_addendi->add(<ArrayList>add1) oppure el_addendi-><ArrayList>add(add1), ma continua a non funzionare...
Sicuramente si tratta di una sciocchezza, ma non riesco a venirne fuori.... potete aiutarmi? Grazie
Non sono laureato in informatica, per cui vorrei che evitaste di commentare come ho scritto il codice... grazie

6 Risposte

  • Re: Template

    Gli stai passando un puntatore ad ArrayList. Prova con
    
     el_addendi->add(*add1);
    
    Se invece volevi proprio il puntatore, dovevi costruire el_addendi in questo modo
    
    CArray<ArrayList*> *el_addendi = new CArray<ArrayList*>;
    
  • Re: Template

    A me sembrano ci siano vari errori, tralasciando la memoria dinamica nel main di cui non capisco il motivo…
    C++ non è Java dove per creare oggetti si usa new (anzi nemmeno andrebbe usato, ma questa è una altra storia…)

    In CArray::add non mi pare tu stia facendo una cosa corretta… anzi nell’ultimo ciclo accedi a celle non permesse
  • Re: Template

    Grazie mille del suggerimento, nella classe CArray ho modificato il metodo add in questo modo
    
     void add(T* elemento)
    
    e ora non mi da più errori di compilazione
    Certamente, sto ancora implementando la classe CArray per cui si, ci sono ancora diversi errori da sistemare, ma questo lo sapevo già... grazie ancora
  • Re: Template

    Eh direi che ci sono errori da sistemare.
    Apparte il fatto che se vuoi utilizzare i puntatori così hai sbagliato linguaggio…

    Analizzando CArray::add [CODE] n_size++; T *temp = new T[n_size]; for (int i = 0; i < n_size - 1; i++) temp[i] = lista[i]; //copi gli elementi… meglio usare std::copy temp[n_size - 1] = elemento; //assegnazione del nuovo elemento for (int i = 0; i < n_size; i++) lista[i] = temp[i]; //ricopi gli elementi in lista… errore di segmentazione quando i = n_size - 1 Ma credo che ora sistemerai facilmente.

    Riguardo CArray::getElement… se volessi modificare il valore di quella come fai? Dovresti ritornare un T&

    ArrayList::copia è un metodo non statico… dovrebbe essere statico invece
  • Re: Template

    Come avresti usato i puntatori in questo codice?
  • Re: Template

    Alessandro1980m ha scritto:


    Come avresti usato i puntatori in questo codice?
    Ma sei obbligato ad usare la memoria dinamica nel main… tipo come esercizio?
    Perché altrimenti è totalmente inutile.

    Cioè il main puoi farlo tranquillamente come [CODE] ArrayList add1; add1.add('0'); … CArray<ArrayList> el_addendi; el_addendi.add(add1); Ovviamente sia con CArray::add e ArrayList::add sistemati e correttamente funzionanti, che prendono un const T& come argomento.

    Inoltre in entrambe le strutture manca un distruttore che rilasci la memoria allocata.

    Ti consiglio infine, se vuoi utilizzare i puntatori, di usare gli smart pointers (std::unique_ptr e std::make_unique al posto di new).
Devi accedere o registrarti per scrivere nel forum
6 risposte