Форвард декларации и shared_ptr
Я пытаюсь реорганизовать свой код так, чтобы я использовал предварительные объявления вместо включения большого количества заголовков. Я новичок в этом и есть вопрос, касающийся boost::shared_ptr.
Скажем, у меня есть следующий интерфейс:
#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
Затем у меня есть функция в другом классе, которая принимает объект IStarterPtr в качестве аргумента, скажем:
virtual void addStarter(IStarterPtr starter)
{
_starter = starter;
}
...
IStarterPtr _starter;
как переслать объявление IStarterPtr без включения IStarter.h?
Я использую C++98, если это актуально.
4 ответа
Совместно используемые указатели работают с заранее объявленными типами, если вы не вызываете * или -> для них, поэтому следует просто написать:-
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
Вы должны включить <boost/shared_ptr.hpp>
конечно
Вы не можете пересылать объявления typedefs в C++98, поэтому в этом случае я обычно вынимаю typedefs, которые мне нужны, и помещаю их в types.h
файл или что-то подобное. Таким образом, код общего типа по-прежнему отделен от определения самого класса.
Хотя это добавит заголовочный файл, вы можете поместить его в отдельный заголовочный файл:
#include <boost/shared_ptr.hpp>
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
а затем включите его как в IStarter.h, так и в другой заголовок, избегая дублирования кода (хотя в этом случае он довольно мал).
Там могут быть лучшие решения, хотя.
Есть способ, но вам нужно включить заголовок boost в ваш файл:
#include <boost/shared_ptr.hpp>
class IStarter;
typedef boost::shared_ptr<IStarter> IStarterPtr;
// ...
virtual void addStarter(IStarterPtr starter)
{
_starter = starter;
}
// ...
IStarterPtr _starter;