5

non mi aspettavo questo codice per compilare:puntatore Unico e const correttezza

#include <iostream> 
#include <memory> 

class A 
{ 
public: 

    inline int get() const 
    { 
     return m_i; 
    } 

    inline void set(const int & i) 
    { 
     m_i = i; 
    } 

private: 

    int m_i; 
}; 

int main() 
{ 
    const auto ptr = std::make_unique<A>(); 

    ptr->set(666); // I do not like this line D:< 
    std::cout << ptr->get() << std::endl; 

    return 0; 
} 

Se PTR era un puntatore cruda C, sarei ok con quello. Ma dal momento che sto usando un puntatore intelligente , non riesco a capire quale sia la logica alla base di questo.

Uso il puntatore univoco per esprimere la proprietà , in Programmazione orientata agli oggetti questa può essere vista come una composizione di oggetto (relazione "parte di").

Ad esempio:

class Car 
{ 
    /** Engine built through some creational OO Pattern, 
     therefore it has to be a pointer-accessed heap allocated object **/ 
    std::unique_ptr<Engine> m_engine; 
}; 

Oppure:

class A 
{ 
    class Impl; 

    std::unique_ptr<A::Impl> m_impl; // PIMPL idiom 
}; 

Se un'istanza di una classe Car è costante, perché il motore non dovrebbe essere costante così? Se fosse un puntatore condiviso, mi sarei trovato perfettamente d'accordo.

C'è un puntatore intelligente che può riflettere il comportamento che voglio?

+1

'ptr-> set (666); // Non mi piace questa riga D: <': Quotazione del giorno;). – 3442

risposta

11

E 'piuttosto semplice:

const auto ptr = std::make_unique<A>(); 

Ciò significa che il puntatore stesso è costante! Ma l'oggetto che contiene non lo è. Puoi vedere che funziona al contrario ...

A *const ptr = new A(); 

È lo stesso. Il puntatore è costante (non può essere modificato per puntare altrove), ma l'oggetto non lo è.

Ora, probabilmente volevi dire che vuoi qualcosa di simile, no?

const auto ptr = std::make_unique<const A>(); 

Ciò creerà un puntatore costante a una costante A.

C'è anche questo altro modo ...

auto ptr = std::make_unique<const A>(); 

L'oggetto è costante, ma non il puntatore.

BTW: Quella "costante propagazione" di cui parli si applica anche al C++, nello stesso modo in cui l'hai dichiarata.

+0

Sì, era chiaro, mi dispiace per aver fatto troppe domande all'interno di una sola domanda. Uno di questi era davvero il seguente: perché il comitato C++ ha creato un puntatore intelligente unico nel suo modo di agire come un puntatore grezza C? Qual è la logica alla base di questo? – nyarlathotep108

+1

@ nyarlathotep108: All'inizio, sembra essere un non-senso, fino a quando non ti accorgi che un puntatore è solo un altro oggetto che contiene l'indirizzo di un altro oggetto. Ci sono momenti in cui vuoi cambiare il puntatore per puntare altrove, ma potrebbe puntare a oggetti costanti. In questi casi (sono piuttosto comuni, però), questo modello salverà il tuo lavoro. – 3442

+0

Non lo trovo utile in questo momento, ma vedo che il tuo punto è probabilmente valido.Forse quando voglio che agiscano allo stesso modo dei riferimenti agiscono (da un punto di vista della correttezza costante), scriverò il mio puntatore unico, non posso vedere in nessun altro modo. – nyarlathotep108

Problemi correlati