Как сделать внутренний заголовок при использовании интерфейса + шаблоны для внедрения зависимостей - PullRequest
0 голосов
/ 11 апреля 2019

В этом блоге о внедрении зависимостей в C ++ автор объясняет гибридный подход, который использует шаблоны и интерфейсы следующим образом:

ICar.h (общедоступный):

#pragma once

struct ICar
{
    virtual void Drive() = 0;
    virtual ~ICar() = default;
};

std::unique_ptr<ICar> MakeV8Car();
std::unique_ptr<ICar> MakeV6Car();

Car.h (внутренний):

#pragma once
#include "ICar.h"

template <typename TEngine>
class Car : public ICar
{
public:
    void Drive() override
    {
        m_engine.Start();
        // drive
        m_engine.Stop();
    }

private:
    TEngine m_engine;
};

Car.cpp:

#include "Car.h"
#include "V8Engine.h"
#include "V6Engine.h"

std::unique_ptr<ICar> MakeV8Car()
{
    return std::make_unique<Car<V8Engine>>();
}

std::unique_ptr<ICar> MakeV6Car();
{
    return std::make_unique<Car<V6Engine>>();
}

Все это имеет смысл для меня, за исключением внутренней части. Давайте предположим, что я создал общий объект из приведенного выше.

Каким образом Car.h является приватным в контексте этого общего объекта?

Я прочитал значение заголовка private в ответе , в котором говорится:

Keep your data in MyClassPrivate and distribute MyClass.h.

Предположительно означает not распространять MyClass_p.h, но как избежать распространения файла заголовка и при этом работать .so?

...