[C++] shared_ptr

di il
5 risposte

[C++] shared_ptr

Ciao a tutti, avrei una domanda sulla dichiarazione degli shared_ptr.
Al momento ho un puntatore statico così dichiarato:
.h:
static graphic* m_graph;

.cpp:
graphic* graphic::m_graph=NULL;
Vorrei sostituirlo con uno shared_ptr. Ho guardato la reference, un paio di esempi e questo è quello che ho fatto:
.h:
static std::shared_ptr<graphic> m_graph;
.cpp:
std::shared_ptr graphic::m_graph;
Ho incluso <memory>, che contiene gli headers per gli shared_ptr.
Compilo, ma compare una valangata di errori (presumo dovuti al fatto che non riconosce il puntatore che ho usato per tutto il programma) di cui il primo è:
"error: ‘m_graph’ is not a member of ‘graphic’" per il .cpp
"error: ‘shared_ptr’ in namespace ‘std’ does not name a type’" per il .h

Ho gcc 4.7, dovrebbe supportare gli shared_ptr a quanto visto dal sito. Qualcuno sa darmi una mano? Penso di aver fatto una bestialata da qualche parte, il problema è che non trovo dove

5 Risposte

  • Re: [C++] shared_ptr

    La sintassi giusta dovrebbe essere
    
    std::shared_ptr<graphic> graphic::m_graph;
    
    Anche se non ne vedo l'utilita di una cosa del genere. Il shared_ptr chiama il destructor dell'oggetto che tiene ma da quel che ho capito l'oggetto é la classe stessa.
  • Re: [C++] shared_ptr

    Grazie skynet, ora ho fatto passi avanti. Ho provato a compilare ma mi dà nuovamente errore, ho scoperto che anche con gcc4.7 bisogna specificare -std=c++11 per fargli usare il nuovo standard, così finalmente mi riconosce gli shared_ptr (ora devo togliere i vecchi delete e risolvere un paio di errori)

    In verità il puntatore è dichiarato in una classe virtuale, viene poi riassegnato in 4-5 classi derivate. Quando l'oggetto della classe derivata vien distrutto (ogni classe derivata l'ho fatta corrispondere a una finestra grafica, quindi quando si apre/chiude una finestra si ha quest'operazione), prima usavo delete() per deallocare la memoria, ho pensato di usare lo shared_ptr proprio per evitare dimenticanze.
    Mi sembra possa essere un utilizzo "furbo", ma non sono ancora bravissimo (ok, sono abbastanza scarso!) con la programmazione, quindi potrei aver toppato in pieno

    Grazie ancora per l'aiuto!
  • Re: [C++] shared_ptr

    Ciao eugen,
    mi intrometto un poco a sproposito, nel senso che non rispondo alla tua domanda ma mi metto a divagare.

    Uno dei comandamenti della OOP recita: 'Non userai mai membri di classe pubblici o protetti'.

    Ora il membro m_graph non è privato per cui violi questo principio. (lo so che te l' avevo scritto io, ma non facciamo i pignoli )

    Ora ti sei reso conto che questo membro esposto pubblicamente provoca dei problemi (ogni volta che qualcuno lo assegna dovrebbe distruggere l' istanza precedente) e stai cercando di ovviare al problema usando gli smart pointer. La soluzione giusta è quella di renderlo privato, fornire un metodo per ottenerlo e un metodo per assegnarlo (quest'ultimo si occuperà della distruzione).
  • Re: [C++] shared_ptr

    Ma che a sproposito, io stesso mi fisso su pezzi di codice e li riscrivo in continuazione (diciamo che faccio labor limae) per cercare di imparare qualcosa, per cui ogni intervento è ben accetto
    Adesso ho problemi con l'assegnare lo shared pointer: mentre prima mi bastava fare nel costruttore della classe derivata
    m_graph=this
    (grazie barba per l'aiuto!) vedo che al nuovo puntatore la sintassi non piace, e io che pensavo che tranne la dichiarazione e metodi specifici tipo il reset() fosse tutto uguale!
    Quel che è certo è che senza l'aiuto del forum non sarei arrivato fino a qui
  • Re: [C++] shared_ptr

    Ultimi aggiornamenti, li scrivo qui non per chiedere assistenza ma perchè ho pensato che se qualcuno dovesse rileggere la discussione almeno sa com'è finita
    Ho abbandonato l'utilizzo dello shared_ptr per il problema dell'assegnazione di *this.
    Pensavo che, supportando il nuovo standard gli smart pointers, non ci fosse più bisogno di Boost, invece per poter fare l'operazione che volevo fare io, bisogna ereditare da una classe, la
    enable_shared_from_this<Y>
    
    che non è supportata dal C++11. Morale: tengo i miei delete() e non installo Boost.
    Grazie ancora a tutti per l'assistenza!
Devi accedere o registrarti per scrivere nel forum
5 risposte