2015-03-25 7 views
1

Для моего назначения я создал класс Robot, который имеет указатель на состояние класса. Этот класс состояний является интерфейсом. Фактическая реализация дочерних классов состояния должна выполняться в отдельной DLL.C++ DLL-зависимости State-pattern

Я смог успешно сделать эти классы в отдельной DLL, так что DLL с дочерними классами штата (StateDLL) ссылается только на DLL, которая содержит класс интерфейса State.

Проблема начинается с конструктора класса Robot. Я должен позволить частной переменной робота State* знаю, что его первый ChildClass будет, например (где S имеет тип State*)

Robot::Robot() { 
    S = StateDLL::StateChild1::get(); 
} 

Означает ли это, что робот должен знать о содержании StateDLL? Есть ли способ рассказать ему о детском классе каким-либо другим способом или не имеет значения, могу ли я указать ссылку RobotDLL в StateDLL (с ​​идеей StateDLL может много измениться, в то время как RobotDLL должен быть более статичным)?

+0

Экспортировать заводскую функцию из 'StateDLL', что-то вроде' State * GetInitialState(); '' Класс робота будет зависеть от этой функции, но не от каких-либо деталей реализации (в частности, не нужно было бы знать о каких-либо отдельных классах, полученных из 'State'). –

ответ

0

Ваш класс Robot должен вообще не знать о StateDLL, желательно, чтобы он получил экземпляр State*, переданный через конструктор. Это позволит свести к минимуму зависимости и разрешить заменяемые реализации и простое тестирование.

Чтобы предотвратить получение RobotDLL каких-либо зависимостей от StateDLL, интерфейса, состоящего из заводской функции, которая просто передает State*, будет достаточно, чтобы позволить StateDLL быть взаимозаменяемым с другой DLL, которая обеспечивает ту же заводскую функцию, или если вы позже решите объединить две библиотеки DLL, одна и та же функция может быть определена в RobotDLL.