Использование интерфейса в C ++ для внедрения зависимостей - PullRequest
2 голосов
/ 07 апреля 2011

Предположим, у меня есть следующий абстрактный класс, и я использую его как «интерфейс» в C ++:

class IDemo
{
  public:
    virtual ~IDemo() {}
    virtual void Start() = 0;
};


class MyDemo : IDemo
{
  public:
    virtual void start()
    {
      //do stuff
    }
};

Затем в классе, который должен иметь дескриптор интерфейса (конкретный класс посредством внедрения):

class Project
{
  public:
    Project(IDemo demo);

  private:
    IDemo *_demo;
};

Я намерен назначить конкретный демонстрационный класс через конструктор Project.Этот код не компилируется, так как IDemo не может быть создан.Какие-либо предложения?Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 07 апреля 2011

Попробуйте:

 Project::Project(IDemo* demo)
     : _demo(demo)
 {}

Но если демонстрационный объект никогда не изменится за время существования проекта, я предпочитаю переходить по ссылке:

class Project
{
    public:
        Project(IDemo& d)
          : demo(d)
        {}
    private:
        IDemo&  demo;
};

Тогда используйте это так:

int main()
{
    MyDemo    demo;
    Project   project(demo);
}
3 голосов
/ 07 апреля 2011
Project(IDemo demo);

Должно быть

Project(IDemo *demo);
2 голосов
/ 07 апреля 2011

Должно быть:

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void Start() = 0;
};


class MyDemo : public IDemo
{
    public:
        virtual void Start()
        {
            //do stuff
        }
};

...............................

class Project
{
    public:
        Project(IDemo* demo);
    private:
        IDemo *_demo;
};

Примечание

(1) class MyDemo : public IDemo

(2) IDemo* demo уже предложено ранее (или вы также можете использовать IDemo& demo, но указатель на интерфейс обычно).

(3) virtual void Start() {...} вместо start (идентификаторы чувствительны к регистру).

1 голос
/ 07 апреля 2011

Это зависит. Если конкретный объект Demo не принадлежит Project, используйте ссылку:

class Project
{
    public:
        Project(IDemo &demo);
    private:
        IDemo &_demo;
};

Если вы хотите владеть, используйте boost::shared_ptr:

class Project
{
    public:
        Project(boost::shared_ptr<IDemo> demo);
    private:
        boost::shared_ptr<IDemo> _demo;
};

Project project(boost::make_shared<Demo>());

В C ++ 0x вы также можете использовать std::unique_ptr, если вы не хотите совместного владения.

1 голос
/ 07 апреля 2011

Не видя точного предупреждения компилятора, я предлагаю вам изменить

Project(IDemo demo);

на

Project(IDemo *demo);
...