Форвард декларации и 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;
Другие вопросы по тегам