в общем написал код ...
подавая на std::cin последовательность команд типа:
png_window
quad 10 20
30 40
60 70
30 23
quad 15 40
60 40
60 120
15 120
rect 80 80
110 120
получил картинку:
до меня еще до сих пор не доходит полная мощь сочетания наследования с виртуальными функциями, раньше верхом крутости казалось: рантайм компилятор формул, построенный на конечных автоматах через манипуляции с указателями на функции ...
а щас все тоже самое ... только после того как только что скомпиленая хрень стала выводить эти крякозяблы на экран через хлиб, решил я добавить возможность вывода их вместо экрана в png файл - если бы раньше пришлось переписывать все приложение с 0 или потратив в 2 раза больше времени ограничится переделкой под это половины кода ... то сейчас просто добавил в проект 1 объектный файл, добавив пару строчек в factory.cpp, безо всякой перекомпиляции остальных файлов проекта - новый код по команде в текстовом файле: png_window ( вместо xlib_window ) перенаправил весь вывод с экрана в png файл ...
тоже самое с новой формой rect - ее исходиники + пара строчек в factory и также без перекомпиляции остального проекта - готова обработка нового типа данных
алексей, привел меня к мысли заценить иерархию классов ...
допустим такая задачка:
имеется уже работающий код:
#include "factory.h"
#include <iostream>
using std::cin;
using std::istream;
shape* get_shape_type(istream& f){
string s;
int err=0;
shape* ps=0;
while(f>>s) {
ps=shape_factory(s);
if (ps ) break;
err++;
}
return ps;
}
void fill_shape(shape* ps,istream& f){
point p;
f>>p.x>>p.y;
while( ps->setPoint(p) ) f>>p.x>>p.y;
}
using std::cerr;
using std::endl;
#include <vector>
using std::vector;
int main() {
string s="xlib_window";
cin>>s;
window* p=window_factory(s,400,500,"alpha");
if (!p) cerr<<"wrong window type: "<<s<<endl,exit(1);
typedef vector<shape*> vps;
vps v;
while(1) {
shape* ps=get_shape_type(cin);
if (!ps) break;
v.push_back(ps);
fill_shape(ps,cin);
}
for ( size_t i=0; i<v.size() ; i++ ) v[i]->draw(p);
p->paint();
delete p;
for ( size_t i=0; i<v.size() ; i++ ) delete v[i];
return 0;
}
c минимальными изменениями в нем и без перекомпиляции\модификации классов унаследованых от window, shape и уже реализованных, сохранением возможности обрабатывать предыдущие текстовые данные ...
добавить возможность создания форм ( в тч унаследованных от уже реализованных ) со способностью задавать толщину линии и ее прерывистость
как это можно сделать, если требуется учесть, что старый интерфейс не располагает резервами для создания новых форм с запрашиваемыми свойствами, но требуется его сохранить, чтобы не переписывать код обрабатывающий старые формы?