Я не уверен, что это утверждение верно
DynamoDB лучше всего работает с одной таблицей на приложение
blockquote>Вы не против поделиться, где вы видели это? DynamoDB действительно работает лучше всего, если схема таблицы построена на основе шаблонов доступа к приложению. Это не обязательно означает, что вы должны уместить все в одном столе.
В заголовке следующей статьи говорится все это: Никогда Не Вызывайте Виртуальные функции во время Конструкции или Разрушения.
Это - потому что Ваш вызов находится в конструкторе. Производный класс не будет допустим, пока конструктор не завершил так Вас, компилятор является правильным в звоне Вас для этого.
Существует два решения:
class parent
{
public:
void Read() { //read stuff }
virtual void Process() { }
parent()
{
Read();
Process();
}
}
Будет работать в целом, но не для вызовов в конструкторе чистого виртуального базового класса. В то время базовый класс в созданном не существует переопределение подкласса, таким образом, Вы не можете назвать его. Пока Вы называете его, после того как весь объект создается, это должно работать.
С другой стороны, сделайте метод фабрики для создания объектов и сделайте конструкторов частными, метод фабрики может затем Инициализировать объект после конструкции.
Необходимо перенести во внутреннюю часть объект, который называет виртуальный метод после того, как объект полностью создается:
class parent
{
public:
void Read() { /*read stuff*/ }
virtual void Process() = 0;
parent()
{
Read();
}
};
class child: public parent
{
public:
virtual void Process() { /*process stuff*/ }
child() : parent() { }
};
template<typename T>
class Processor
{
public:
Processor()
:processorObj() // Pass on any args here
{
processorObj.Process();
}
private:
T processorObj;
};
int main()
{
Processor<child> c;
}
Поверхностная проблема состоит в том, что Вы вызываете виртуальную функцию, это еще не известно (Объекты создаются от Родителя до Ребенка, таким образом так vtables). Ваш компилятор предупредил Вас об этом.
Существенная проблема, насколько я вижу, состоит в том, что Вы пытаетесь снова использовать функциональность наследованием. Это - почти всегда плохая идея. Вопросы проектирования, так сказать :)
По существу Вы пытаетесь инстанцировать Шаблонного шаблона Метода, отделиться какой от когда: сначала считайте некоторые данные (в некотором роде), затем обработайте их (в некотором роде).
Это будет, вероятно, намного лучше работать с агрегированием: дайте функцию Обработки Шаблонному методу, который назовут в правильное время. Возможно, можно даже сделать то же для функциональности Read.
Агрегирование может быть сделано двумя способами:
Пример 1: привязка во время выполнения
class Data {};
class IReader { public: virtual Data read() = 0; };
class IProcessor { public: virtual void process( Data& d) = 0; };
class ReadNProcess {
public:
ReadNProcess( IReader& reader, IProcessor processor ){
processor.process( reader.read() );
}
};
Пример 2: время компиляции связывая
template< typename Reader, typename Writer > // definitely could use concepts here :)
class ReadNProcess {
public:
ReadNProcess( Reader& r, Processor& p ) {
p.process( r.read() );
}
};
С одним шагом больше Вы могли просто представить некоторую функцию как
class parent
{
public:
void initialize() {
read();
process();
}
}