unique_ptr e riferimenti - domanda sullo stile di codifica

2

Sono abbastanza sicuro che questa è una domanda puramente estetica, ma volevo avere tutte le tue opinioni su di esso prima di iniziare a proliferare questo tipo di codice nella mia base di codice. Considera il seguente codice:

//Foo.h
class Bar;
class Foo
{
    public:
       Bar& GetBar(){return *bar.get();}
    private:
       std::unique_ptr<Bar> bar;
};

//Bar.h
class Bar
{
     public:
         DoSomething(){//did something...}
};

Questo ci permette di inoltrare la barra di dichiarazione in Foo.h ed evitare di includere #include Bar.h. Questo porta all'utilizzo di Foo's Bar nel modo seguente:

Foo foo;
foo.GetBar().DoSomething();

Personalmente, penso che sarebbe molto più bello:

Foo foo;
foo.bar.DoSomething();

Per riuscirci, ho scritto:

//Foo.h
class Bar;
class Foo
{
    public:
        Foo();
        Bar& bar;
    private:
        std::unique_ptr<Bar> bar_ptr;
};

//Foo.cpp
#include "Bar.h"
Foo::Foo() : bar_ptr(new Bar()), bar(*bar_ptr) {}

Questo mi consente di inoltrare la barra di dichiarazione e utilizzare la "barra". sintassi.

Ugly? Non brutto? Lo svantaggio è che ho 2 membri vars per solo 1 oggetto.

    
posta Aeluned 17.04.2013 - 16:48
fonte

2 risposte

13
foo.GetBar().DoSomething();

Ciò viola la Law Of Demeter .

In genere eviterei di esporre Bar interamente:

foo::doBarSomething() { this->bar.doSomething(); }
    
risposta data 17.04.2013 - 17:32
fonte
2

Di solito non è una buona idea usare un riferimento come membro della classe.

Se si utilizza un riferimento, è necessario definire l'oggetto a cui fa riferimento nel costruttore e non sarà mai più possibile modificare l'oggetto a cui tale riferimento fa riferimento nuovamente. Di conseguenza, avrai seri problemi se chiami bar_ptr.reset () e provi ad accedere alla barra.

Inoltre, l'utilizzo di un riferimento nel modo in cui si sta utilizzando è essenzialmente lo stesso di dichiarare la barra come variabile pubblica non puntatore. Onestamente non vedo un motivo per tutto questo inconveniente solo per non doverlo includere tra le intestazioni.

    
risposta data 21.04.2013 - 01:19
fonte

Leggi altre domande sui tag