В этом блоге о внедрении зависимостей в 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
?