Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C++]: Classi annidate

  1. #1
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40

    [C++] classi annidate

    Ho realizzalizzato la seguente classe per effettuare alcune operazioni su un vettore di interi:

    codice:
    class vettore
    {
    	int *v,size;
    public:
    	vettore(int); //costruttore normale
    	~vettore();//distruttore
    	vettore(const vettore &op2); //costruttore di copia
    	vettore operator+(vettore op2);
    	vettore operator=(vettore op2);
    	vettore operator++(int notused);
    	vettore operator*(int op2);
    	void dispay();
    };
    in seguito ho realizzato una classe matrice e voglio che sfrutti le caratteristiche della classe vettore in questo modo:

    codice:
    class matrice 
    {
    	int righe,colonne;
    	vettore *m;
    public:
    	matrice(int,int); //costruttore normale
    	~matrice();//distruttore
    	matrice(const matrice &op2); //costruttore di copia
    	matrice operator+(matrice op2);
    	matrice operator=(matrice op2);
    	matrice operator++(int notused);
    	matrice operator*(int op2);
    	void dispay();
    };
    E fin qui tutto ok (almeno credo)

    Il problema è nel costruttore della classe matrice:

    codice:
    matrice::matrice(int dimr,int dimc)
    {	
    	righe=dimr;
    	m=new vettore [righe];  //ho un errore qui errore 
    	if(!m)
    	{
    		cout << "Errore";
    		exit(1);
    	}
    }
    perchè?

    se può essere utile il costruttore di vettore è:

    codice:
    vettore::vettore(int dim=3)
    {	
    	size=dim;
    	int i;
    	v=new int[size];
    	if(!v)
    	{
    		cout << "Errore";
    		exit(1);
    	}
    	for(i=0;i<size;i++)
    		v[i]=rand()%100;
    }
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Devi specificare quale è l'errore.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Spero di aver capito
    Se definisco almeno un costruttore (anche se poi questo costruttore ha solo un parametro di default) il costrutture di default (quello senza parametri per intenderci) non viene creato.
    Siccome l'operatore di new può creare solo oggetti con costruttore di default il problema è proprio lì.
    Io avrei fatto così:
    codice:
    class vettore
    {
    	int *v,size;
    public:
    	vettore(int); //costruttore normale
            explicit vettore(); // costruttore di default che inizializza v a NULL.
    	~vettore();//distruttore
            void resize(int); // Per ridimensionare il vettore.
    	vettore(const vettore &op2); //costruttore di copia
    	vettore operator+(vettore op2);
    	vettore operator=(vettore op2);
    	vettore operator++(int notused);
    	vettore operator*(int op2);
    	void dispay();
    };
    Ovviamente costruita la matrice avrei chiamato resize per ridimensionare i singoli vettori al numero delle colonne.
    Poi avrei aggiunto un controllo sull'uso di vettore nel caso non fosse stato inizializzato.
    Ancora meglio avrei fatto:
    codice:
    class vettore
    {
    	int *v,size;
    protected:
            explicit vettore(); // costruttore di default che inizializza v a NULL.
            friend class matrice;
    public:
    	vettore(int); //costruttore normale
    	~vettore();//distruttore
            void resize(int); // Per ridimensionare il vettore.
    	vettore(const vettore &op2); //costruttore di copia
    	vettore operator+(vettore op2);
    	vettore operator=(vettore op2);
    	vettore operator++(int notused);
    	vettore operator*(int op2);
    	void dispay();
    };
    In questo modo solo la matrice avrebbe potuto creare i vettori non inizializzati e successivamente inizializzarli, eliminando così il controllo sui vettori non inizializzati (perchè sicuramente matrice sa quello che fa).

    Spero di averci acchiappato

  4. #4
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40
    Si, fastcoder credo che tu ci abbia azzeccato; proverò il tuo codice e ti farò sapere; l'errore era il seguente:

    error C2512: 'vettore' : no appropriate default constructor available
    Error executing cl.exe.
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40
    funziona tutto. grazie. ma che vuol dire explicit nella classe vettore?
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da zuffff
    funziona tutto. grazie. ma che vuol dire explicit nella classe vettore?
    Explicit indica un costruttore esplicito.
    E' un concetto un po difficile da spiegare.
    Un costruttore che usa argomenti può essere soggetto a conversioni implice dal compilatore. Praticamente un tipo di dato inserito in un costruttore, magari se questo non è appropriato, può essere implicitamente convertito in un tipo di oggetto idoneo per il costruttore.

    Mettiamo caso di avere una classe che prende come costruttore un int

    codice:
    class MiaClasse
    [
        MiaClasse();
        MiaClasse(int i = 10);
    ];
    Mettiamo ora caso di avere una funzione che invece prende una istanza di questa tua classe

    codice:
    void Print(MiaClasse &cls);


    Adesso, metti il caso in cui tu stai scrivendo del codice con queste due definizioni e utilizzi in modo sbagliato la funzione print
    codice:
    Print(15);
    Come puoi vedere è sbagliato in quando Print vuole una istanza di MiaClasse mentre tu gli hai appena passato un intero.Cosa fa il compilatore? dato che il costruttore della MiaClasse prende un intero, crea una classe MiaClasse al volo utilizzando come costruttore il parametro che gli hai passato (in questo caso 15) e la utilizza per la funzione print.
    Ciò può essere molto confusionario e dunque si utilizzano i costruttori explicit.
    Mettendo explicit prima di un costruttore di una classe vuol dire che il costruttore vuole solo un parametro reale e niente conversioni implicite e quindi implica il passaggio di parametri corretti.
    Se il costruttore fosse stato cosi
    codice:
    explicit MiaClasse(int i = 10);
    Chiamando la funzione Print(15) il compilatore ti avrebbe dato un errore.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di zuffff
    Registrato dal
    Sep 2004
    Messaggi
    40
    ok credo di aver capito; nel dubbio è meglio mettere sempre explicit. ciao
    La teoria è quando si sa tutto ma non funziona niente.
    La pratica è quando funziona tutto ma non si sa il perché.
    In ogni caso si finisce sempre con il coniugare la teoria con la pratica:
    non funziona niente e non si sa il perché.
    (Albert Einstein)

  8. #8
    Direi di no...nel dubbio è meglio riflettere...non come ho fatto io che ho messo explic quando non serviva

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.