2013-05-16 7 views
8

Ich versuche, meinen Code zu refaktorieren, so dass ich Forward-Deklarationen statt viele Header verwenden. Ich bin neu dazu und habe eine Frage zu boost :: shared_ptr.Forward-Deklarationen und shared_ptr

sagen, dass ich die folgende Schnittstelle haben:

#ifndef I_STARTER_H_ 
#define I_STARTER_H_ 

#include <boost/shared_ptr.hpp> 

class IStarter 
{ 
public: 
    virtual ~IStarter() {}; 

    virtual operator()() = 0; 
}; 

typedef boost::shared_ptr<IStarter> IStarterPtr; 

#endif 

ich eine Funktion in einer anderen Klasse, dann haben die ein IStarterPtr Objekt als Argument nimmt, sagen:

virtual void addStarter(IStarterPtr starter) 
{ 
    _starter = starter; 
} 
... 
IStarterPtr _starter; 

Wie erkläre ich nach vorn IStarterPtr ohne einschließlich IStarter.h?

Ich verwende C++ 98, wenn das relevant ist.

Antwort

7

freigegebenen Zeiger arbeiten mit Vorwärts-Typen deklariert, solange Sie rufen nicht * oder -> auf sie so sollte es funktionieren, einfach schreiben: -

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

Sie müssen <boost/shared_ptr.hpp> natürlich enthalten

2

obwohl es eine Header-Datei hinzufügen würde, könnten Sie das in einer separaten Header-Datei setzen:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

und schließt es dann sowohl in IStarter.h und in der anderen Header, co vermeiden Duplizierung (obwohl es in diesem Fall ziemlich klein ist).

Es könnte jedoch bessere Lösungen geben.

1

Es gibt einen Weg, aber Sie müssen die Boost-Header in der Datei enthalten:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

// ... 

virtual void addStarter(IStarterPtr starter) 
{ 
     _starter = starter; 
} 
// ... 
IStarterPtr _starter; 
1

Sie können nicht nach vorne erklären typedefs in C++ 98 so, was ich in der Regel in diesem Fall zu tun ist herausziehen die typedefs brauche ich und stecke sie in eine types.h Datei oder etwas ähnliches. Auf diese Weise ist der allgemeine Typcode immer noch von der Definition der Klasse selbst getrennt.