2012-02-06 19 views
6

Mam klasę, która ma obiekt boost::asio::io_service. Chcę ten obiekt przechowywać w boost::shared_ptr.Initialize Boost shared_ptr w konstruktorze

Więc mój nagłówek wygląda następująco (Pozbyłem się niepotrzebnego kodu, tak aby nie rozpraszać)

class CommandDispatcher 
{ 
private: 
    boost::shared_ptr<boost::asio::io_service> m_ioservice; 
public: 
    CommandDispatcher(); 
}; 

Kiedy teraz utworzyć obiekt CommandDispatcher chcę, że obiekt io_service być inicjowane przez wskaźnik. Teraz nie jestem do końca pewien, jak to zrobić. Sprawdziłem dwie różne rozwiązania, ale tylko jedna działa i nie jestem do końca pewna, czy to jest dobre. Ale zobaczyć na własne oczy:

CommandDispatcher::CommandDispatcher() 
{ 
    m_ioservice.reset(new boost::asio::io_service);   // this actually works 
    //m_ioservice = boost::make_shared<boost::asio::io_service> 
    // (new boost::asio::io_service);      // this doesn't work 
} 

więc wywołanie reset działa, ale myślę, że ten jeden jest rzeczywiście przypisać wskaźnik. Więc to jest nie jest złe,, aby go użyć, ale nie wydaje mi się to najmilsze rozwiązanie dla mnie. Sugestia dla połączenia make_shared znalazłem w innym pytaniu. Ale ten po prostu mi nie zadziała (zaimplementowałem go tak, jak opisano w oficjalnym przykładzie doładowania). I dostać

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: invalid conversion from ‘boost::asio::io_service*’ to ‘size_t’

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: initializing argument 1 of ‘boost::asio::io_service::io_service(size_t)’

nie jestem pewien, jak to zrobić teraz, co byłoby najlepszym sposobem (może jest kompletnym inna opcja to zrobić). A może robię to dobrze, ale dostaję coś z błędem io_service.

Mam nadzieję, że to pytanie nie było już tutaj w ten sposób (szukałem starego pytania, ale odpowiedź nie wydawała mi się odpowiednia).

+0

Dlaczego zmienne prywatne są wyświetlane przed publicznymi metodami? Z pewnością interfejs publiczny jest ważniejszy niż szczegóły dotyczące prywatnych implementacji? :)

+0

Cóż, faktycznie pomyślałem (i dowiedziałem się jakiś czas temu), że to "dobry ton", aby najpierw zadeklarować publiczne i prywatne zmienne członkowskie, a następnie zadeklarować publiczne i prywatne metody. – Toby

+0

Myślę, że większość ludzi byłaby bardziej zainteresowana interfejsem publicznym, w przeciwieństwie do zmiennych, których używasz do jego osiągnięcia. –

Odpowiedz

7
CommandDispatcher::CommandDispatcher() 
    : m_ioservice(new boost::asio::io_service) // ver 1. this is how you should do it. 
{ 
    //m_ioservice.reset(new boost::asio::io_service); // ver 2  
    //m_ioservice = boost::make_shared<boost::asio::io_service>(); // ver 3 
} 
+0

Tak, to działa (i wydaje się ładne), ale nie rozumiem, gdzie jest różnica między tym wywołaniem a 'm_ioservice = new boost :: asio :: io_service', które tak naprawdę nie działa ??? – Toby

+0

Które połączenie nazywa się "to połączenie"? – ronag

+0

Haha przepraszam za sformułowanie nieco niejasne. Jeśli powiesz, że 'CommandDispatcher :: CommandDispatcher(): m_ioservice (nowe boost :: asio :: io_service)' nie jest tym samym, co sayin 'CommandDispatcher :: CommandDispatcher() {m_ioservice = new boost :: asio :: io_service; } '? – Toby

8

Jeśli używasz make_shared, nie używaj samodzielnie new; przekazujesz mu argumenty konstruktora i utworzy obiekt dla ciebie. W tym przypadku nie ma argumentów, więc po prostu zrobić:

m_ioservice = boost::make_shared<boost::asio::io_service>(); 

chociaż byłoby ładniej, aby zainicjować go na liście initialiser zamiast ciała konstruktora:

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared<boost::asio::io_service>()) 
{ 
} 

Korzystanie make_shared ma tę zaletę, że wykona tylko jedną alokację pamięci, podczas gdy inicjalizacja za pomocą new boost::asio::io_service będzie wymagać dwóch (jedna dla obiektu i jedna dla współużytkowanej liczby odniesienia).

1

ładny sposobem jest prawdopodobnie

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(new boost::asio::io_service) 
{ 
} 

ponieważ alternatywą ma pan domyślnych konstruowania shared_ptr pierwszy, a następnie ponowne przypisanie go.

Lub równoważnie użyciu make_shared:

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared<boost::asio::io_service>()) 
{ 
} 
0

Istnieje kilka sposobów:

  • dla prostego inicjalizacji, utworzone w liście konstruktora:

.

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(new boost::asio::io_service) 
{ 
} 
  • do iniekcji zależność przy użyciu fabrycznie:

.

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(Factory::Create()) 
{ 
} 
  • do wstrzykiwania zależności używając przekazując już utworzony obiekt:

.

CommandDispatcher::CommandDispatcher(boost::shared_ptr<boost::asio::io_service> service) : 
    m_ioservice(service) 
{ 
} 
Powiązane problemy