Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18

    [C++] Problema su classi e tipi

    Salve sono un novizio del C++, e per diletto a scopo didattico, stavo riscrivendo un piccolo applicativo, scritto in java, in C++ anche per capire meglio le differenze e il diverso approccio di questo linguaggio.
    Mi son letto un paio di guide basilari, ma tanto per ora di esercizi basilari si parla, ma non ho capito se la cosa che ora esporrò non è possibile farla o non sono in grado io con la mia scarsa esperienza.
    In pratica ho due classi A e B. In A un attributo di tipo B e in B un attributo di tipo A.
    In base a come le dichiaro(se prima una o l'altra) mi da errore di non identificazione di un tipo o dell'altro. Non fa differenza se messe nello stesso header o in header differenti.

    Riporto l'esempio per chiarir meglio la cosa.

    class A {
    B x; //qui mi da errore di tipo non definito
    public:
    A() {
    }
    ~A(){
    }
    };

    class B {
    A y; //qui da errore se dichiaro prima B di A e ovviamente in questo caso non lo da sopra
    public:
    B() {
    }
    ~B(){
    }
    };

    Andando a logica che non riconosca il tipo B quando è su uno stesso header mi sta anche bene perchè lo dichiaro dopo.
    Ma nel caso in cui ho un header B.h in cui dichiaro B e includo A.h e un file A.h in cui dichiaro A e includo B.h perchè da lo stesso errore? probabilmente applica una precedenza di inclusione e di fatto ricrea il caso di cui sopra. Ma allora come posso fare? Anche dichiarando friend B ad A la cosa non cambia.

    Ho detto castronerie? Se si fatemelo notare senza problemi ^^

  2. #2
    gli attibuti non esistono nelle classe c++, si chiamano membri.

    Comunque non puoi farlo perchè il compilatore non sa quanta memoria allocare per il membro x della classe A. Se vuoi tenere tutto nello stesso file, come hai scritto, allora devi usare un riferimento alla classe B come di seguito
    codice:
    class A {
    	class B *x; //qui mi da errore di tipo non definito
    public:
    	A() {
    }
    	~A(){
    	}
    };
    
    class B {
    	A y; //qui da errore se dichiaro prima B di A e ovviamente in questo caso non lo da sopra
    public:
    	B() {
    	}
    	~B(){
    	}
    };
    
    int main ()
    {
    	return (0);
    }
    Scrivi però prima del membro x class B *
    Se vuoi utilizzare un oggetto della classe B anzichè un riferimento devi usare più file headers, in uno definisci la classe A e nell'altro la classe B
    ciao
    sergio

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Innanzitutto ti ringrazio della riposta tempestiva.

    Ti riporto il caso che stavi dicendo tu con due header separati. Mi da ancora errore se non metto class prima del puntatore al membro x di tipo B. Perchè? E sopratutto con class davanti poi x lo considero cmq come un puntatore ad un oggetto B o no?
    E poi perchè per esempio errore me lo da su A e non su B visto che sono fondamentalmente scritte uguali?

    //File A.h

    #include "B.h"

    class A {
    B *x; //cosi mi da errore, con class davanti no.
    public:
    A() {
    }
    ~A(){
    }
    };

    //File B.h

    #include "A.h"

    class B {
    A* y;
    public:
    B() {
    }
    ~B(){
    }
    };

    Visto che ci siamo faccio un'altra domanda:
    un puntatore si dichiara ad esempio cosi:
    int *x; //puntatore ad un int

    Questa dicitura è uguale ?
    int* x;

  4. #4
    nei file include devi mettere solo le dichiarazioni.
    Quando scrivi class B * x; stai dicendo al compilatore che x è un puntatore ad una classe che si chiama B e che sarà definita successivamente. Il compilatore deve comunque associare ad x solo la memoria di un puntatore ad una classe.
    Le diciture
    int* x;
    int * x;
    int *x;
    sono equivalenti anche se io preferisco la terza che esplicita meglio, secondo me, che x è un puntatore a int.
    ciao
    sergio

  5. #5
    • usa i tag {code} o {php} (al posto delle graffe metti le quadre)altrimenti non è molto leggibile il codice qui nel forum
    • usa l'ifndef trick per evitare inclusioni ricorsive
    • forward declaration
    • i distruttori falli sempre virtuali


    ad esempio nel tuo caso:
    Codice PHP:
    // file "A.h"
    #ifndef A_h
    #define A_h

    #include "B.h"

    class B// forward declaration della classe B

    class {
        
    *x;
        public:
        
    A() {
        }
        
    virtual ~A(){
        }
    };
    #endif 
    Codice PHP:
    // file B.h
    #ifndef B_h
    #define B_h

    #include "A.h"

    class A// forward declaration della classe B

    class {
        
    Ay
        public:
        
    B() {
        }
        
    virtual ~B(){
        }
    };
    #endif 
    Codice PHP:
    // main.cpp
    #include "A.h"
    #include "B.h"

    int main (){
        
    A a;
        
    B b;
        return 
    0;


  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    18
    Vi ringrazio infinitamente

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.