Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626

    [c++] return di un riferimento a un elemento di std::vector

    Ciao a tutti,
    Ho questa situazione:
    codice:
    //components.h
    typedef struct structPositionComponent{
         float x;
         float y;
         float z;
         structPositionComponent(){
           x = y = z = 0;
         }
    }PositionComponent;
    
    //componentmanager.h
    template <typename T>
    class ComponentManager
    {
        public:
            ComponentManager(){};
            virtual ~ComponentManager(){};
    
            T& getComponent(Entity* e){
               if(this->_map.find(e) == this->_map.end()){
                 return create(e);
               }
    
               return this->components[this->_map[e]];
    
            };
            T& create(Entity* e){
               if(this->_map.find(e) == this->_map.end()){
                  T data;
                  this->components.push_back(data);
                  this->_map[e] = this->components.size() - 1;
                  return this->components[this->components.size() - 1];
               }else{
                 return this->components[this->_map[e]];
               }
            }
        protected:
        private:
            std::vector<T> components;
            std::map<Entity*, unsigned int> _map;
    };
    
    //main.cpp
    
    int main(){
      ComponentManager<PositionComponent> posManager;
      Entity the_entity;
    
      PositionComponent p = posManager.create(&the_entity);
      p.x = 3.0f;
      p.y = 3.0f;
      p.z = 2.1f;
    
      PositionComponent ptest = posManager.getComponent(&the_entity);
      std::cout << "->" << (float)ptest.x << std::endl;
    }
    Io mi aspettavo che venisse stampato a video 3.0 ...invece stampa 0. Mi viene il dubbio che p è una copia invece dell'elemento dentro il vettore. Quancuno mi dice dove sbaglio ? Devo per forza usare un puntatore?

    PS:
    Se invece di fare
    codice:
     T data;
      this->components.push_back(data);
    facco
    codice:
    this->components.push_back(new T);
    E' la stessa cosa a livello di memoria?

    Grazie
    Ultima modifica di boots; 23-04-2016 a 18:22

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Nel main, quando chiami la funzione, controlla il tipo della variabile a cui assegni. Lì stai facendo una copia
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Così sembra andare

    codice:
    PositionComponent &p = posManager.create(&the_entity);
    Una domanda
    codice:
    T data;
    this->components.push_back(data);
    la push_back, dovrebbe farsi una copia di data (che sta sullo stack), giusto? se io faccio
    codice:
    this->components.push_back(new T);
    T viene viene allocata nel heap...ma poi lo spazio non viene più liberato?
    C'è un modo più conciso (o migliore) per aggiugere un nuovo T nel vettore?

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non puoi fare new, ha tipo T* non T.
    Non preoccuparti della copia oppure trasforma tutto il codice per usare i puntatori.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    però potrei scrivere
    this->components.push_back(*(new T));

    cmq mi confermi che in questo modo alloco memoria senza poterla liberare?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da boots Visualizza il messaggio
    però potrei scrivere
    this->components.push_back(*(new T));

    cmq mi confermi che in questo modo alloco memoria senza poterla liberare?
    Oltre ad allocare la memoria senza liberarla, effettui lo stesso la copia...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ma io voglio che venga fatta una copia nel vettore

    mi chiedevo se ci fosse un modo più semplice, senza dichiarare T data

    PS:
    Ma con i template non è possibile separare la dichiarazione dal implementazione della classe (.h e .cpp) ?

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    No, in quanto a tempo di compilazione viene generato codice specifico per ogni uso che ne fai. La separazione complicherebbe di molto il tutto, oltre al fatto che in ambiente C/C++ è impossibile collegare file header e file di implementazione se non attraverso convenzioni.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Capito...

    Grazie ancora

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Di niente
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.