Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]inizializzazione var membro

    ciao.
    Ho una classe con al suo interno una mappa come variabile mebro
    la mappa è std::map<string,DX_POSITION> m_mapPosition;
    codice:
    class CEntityData
    {
    public:
    	CEntityData(void);
    	~CEntityData(void);
    
    	vector<CMeshData*>Meshes;
    	std::map<string,DX_POSITION> m_mapPosition;
    	D3DXMATRIX m_MXPosition;
    
    };
    il problema è che ho utilizzato questa classe all interno di un altra classe anchessa come variabile membro , come riferimento pero' cosi:
    codice:
    class CEntity
    {
    public:
    	CEntity(void);
    	~CEntity(void);
            CEntityData* m_pEntityData
    };
    quando instanzio pero' questa classe CEntity al suo interno m_pEntityData->m_mapPosition ha un puntatore a schifo , non è inizializzata.
    Come devo inizializzare la mappa?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma, per cominciare, hai allocato il nuovo oggetto di tipo CEntityData ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: [c++]inizializzazione var membro

    Originariamente inviato da giuseppe500
    Come devo inizializzare la mappa?
    dipende da quello che ci vuoi fare. Ad esempio (tra i tanti):
    Codice PHP:
    CEntity::CEntity(void):
    m_pEntityData (NULL){
    }

    CEntity::CEntity(void){
        
    m_pEntityData NULL;
    }

    CEntity::CEntity(void):
    m_pEntityData (new std::map<string,DX_POSITION>){
    }

    CEntity::CEntity(void){
        
    m_pEntityData = new std::map<string,DX_POSITION>;
    }

    CEntity::CEntity(std::map<string,DX_POSITION> * theMap):
    m_pEntityData (theMap){
    }

    CEntity::CEntity(std::map<string,DX_POSITION> * theMap):
        
    m_pEntityData theMap;


  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    ne deduco quindi che ogni variabile membro va inizializzata,come si fa per le variabili membro di tipi primitivi
    Solo che non ho capito , tra gli esempi questo:
    codice:
    CEntity::CEntity(void){
        m_pEntityData = new std::map<string,DX_POSITION>;
    }
    m_pEntityData è di tipo CEntityData* perchè inizializzarlo come mappa?è un errore di scrittura?
    codice:
    CEntity::CEntity(void){
        m_pEntityData = NULL;
    }
    codice:
    CEntityData::CEntityData(void){
        m_mapPosition = new std::map<string,DX_POSITION>;
    }
    in questo caso penso sia sbagliato , dato che m_mapPosition non è un puntatore,(se fosse un puntatore avrei capito)
    o cosi' :
    codice:
    CEntityData::CEntityData(void){
       m_mapPosition = NULL;
    }
    dubbio:se assegno a null la mappa come posso aggiungere elementi ?
    ho un po di confusione.

  5. #5
    Originariamente inviato da giuseppe500

    m_pEntityData è di tipo CEntityData* perchè inizializzarlo come mappa?è un errore di scrittura?
    sì ho sbagliato io ;-)
    correggo:
    Codice PHP:
    CEntity::CEntity(void): 
    m_pEntityData (NULL){ 


    CEntity::CEntity(void){ 
        
    m_pEntityData NULL


    CEntity::CEntity(void): 
    m_pEntityData (new CEntityData ){ 


    CEntity::CEntity(void){ 
        
    m_pEntityData = new CEntityData


    CEntity::CEntity(CEntityData theEntityData): 
    m_pEntityData (theEntityData){ 


    CEntity::CEntity(CEntityData theEntityData): 
        
    m_pEntityData theEntityData


  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie MacApp.
    un ultima cosa:
    codice:
    CEntity::CEntity(void){
        m_pEntityData = NULL;
    }
    e

    codice:
    CEntity::CEntity(void){
        m_pEntityData = new CEntityData;
    }
    il secondo , alloca la memoria , e l'altro(il primo) assegna a null il puntatore.
    se la classe ha dei metodi e chiamo m_pEntityData->metodo() col secondo sono sicuro che funzioni , ed ho capito , ma con il primo metodo come fa a funzionare?
    m_pEntityData è null! come fa a chiamare metodi un indirizzo 0?

    grazie.

  7. #7
    Originariamente inviato da giuseppe500
    (il primo) assegna a null il puntatore.
    se la classe ha dei metodi e chiamo m_pEntityData->metodo() col secondo sono sicuro che funzioni , ed ho capito , ma con il primo metodo come fa a funzionare?
    m_pEntityData è null! come fa a chiamare metodi un indirizzo 0?

    grazie.
    Dipende da quello che ci vuoi fare tu. Ti ho semplicemente fatto vedere come si inizializza. Chiaro che se lo inizializzi a NULL non puoi dereferenziarlo.. prima di farlo gli darai un indirizzo valido.
    Il punto e', o gli dai da subito un indirizzo valido, oppure lo setti a NULL, altrimenti (se non lo inizializzi) in genere conterra' un valore indefinito che ti causera' problemi indefiniti ;-)

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    E se invece del puntatore *m_pObj ad oggetto ho un oggetto m_Obj per intenderci.
    come lo inizializzo?

  9. #9
    Codice PHP:
    #include <string>

    class GEntity{
        private:
        const 
    std::string &fConstStringRef;
        const 
    std::string fConstString;
        
    std::string fString1;
        
    std::string fString2;
        
    std::string fDefaultString;
        
    std::string fString3;
        
        public:
        
    GEntity (const std::string &theString);
    };

    GEntity::GEntity (const std::string &theString):
    fConstStringRef (theString),
    fConstString (theString),
    fString1 (theString),
    fString3 ("tre"){    
        
    // sono gia' stati chiamati i costruttori di default di fString2 e fDefaultString.
        
    fString2 theString
    }

    int main (void){
        
    std::string aString ("Hello World!");
        
    GEntity aEntity (aString);


  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    un ultima cosa:
    è vero che il vector ha un costruttore di default quindi non va inizializzato?
    grazie,.

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.