Я хотел бы создать API, который предоставляет интерфейс класса для функциональности (файл заголовка) и скрыть реализацию по всем стандартным уважительным причинам.Я планирую использовать фабрику объектов для возврата указателей объектов производных «новых» объектов, которые соответствуют интерфейсу.
Мой базовый класс API варьируется в зависимости от std :: векторы встроенных числовых типов (char, uchar, короткий, ushort, int, uint, float и double).Таким образом, шаблон выглядит как естественная подгонка.Я сделаю шаблон класса интерфейса доступным для пользователей моего API и выведу его из шаблона реализации, который будет скрыт.
Поскольку мой видимый для пользователя шаблон класса - это интерфейсный класс, я бы хотелобъявлять все методы чисто виртуальными, но я понимаю, что могут возникнуть проблемы с выполнением этого требуемого экземпляра шаблона / экспорта в dll, общих объектах и т. д. Поэтому я просто определю их виртуальные и дам им пустые тела методов в базовом классе интерфейса.Где-то вдоль линии мне нужно создать шаблон статического метода фабрики (или шаблонную функцию), который будет создавать объекты производных классов и возвращать указатели на них вызывающей стороне.
Проблема в том, что я не могу поставить реализациюметода фабрики статических объектов в заголовочном файле интерфейса, так как он должен создавать объекты производных классов, которые должны быть скрыты.Поэтому я хотел бы поместить эти фабрики статических объектов в заголовок реализации или исходный файл.
Вот заголовок концептуальной реализации
#ifndef INTERFACE_H
#define INTERFACE_H
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
// This interface class is exported from the dll.
template < typename T >
class DLL_API InterfaceClass {
public:
static InterfaceClass* factoryMethod( );
virtual ~InterfaceClass ( ) { }
virtual void someMethod( T aParam ){ };
protected:
InterfaceClass ( ) { }
private:
InterfaceClass ( const InterfaceClass & );
InterfaceClass& operator=( const InterfaceClass & );
};
#endif
Вот класс концептуальной производной реализации
#ifndef IMPLEMENTATION_H
#define IMPLEMENTATION_H
#include <vector>
#include "interface.h"
template < typename T >
class DerivedClass : public InterfaceClass< T > {
public:
DerivedClass( const T& aDataVector ) : InterfaceClass< T >( ) { /*...*/ }
virtual ~DerivedClass( ) { /*...*/ }
virtual void someMethod( T aParam ) { /*...*/ }
private:
std::vector< T > _dataVector;
};
Примечание. На самом деле я буду использовать TR1 :: shared_ptr вместо необработанных указателей.
Мои вопросы:
1) Где определить статический метод "factoryMethod ()" (creation.h или creation.cpp)?
2) Как выглядит реализация этого метода?
3) Есть ли какие-либо другие проблемы, о которых мне нужно знать, чтобы я или мои пользователи API не получали ошибок во время соединения или во время выполнения?
заранее спасибо!