Фабрика (С++)
да в принципе этого достаточно.
Factory f;не очевидно, что a и b указывают на разные объекты.
Object* a = f;
Object* b = f;
Все равно спасибо
не очевидно, что a и b указывают на разные объекты.Не очевидно, что делать, когда метод принимает аргументы.
Чувак, ставь Trigger Warning перед таким кодом, пожалуйста! У меня PSTD!
class A{
public:
int get{return a;}
A{a=2;}
operator A*{cout<<"here"<<endl; return this; }
private: int a;
};
int main{
A b;
A* c = b;
A*t = A;
cout<<t->get<<endl;
}
А для фабрик, стоит наверно, использовать что-то похожее на "создать объект" (createObject) метод, куда понятнее
DbStream statement("select id from blah where name = :1")
statement << name;
statement >> id;
delete statement;
Он, кстати, отлично работает (пока маппинг name -> id уникален).
пойду в свою модель данных в php внедрю похожий интерфейс
Ну, почти так - всё-таки bind-переменные именованные и типизированные.
И delete конечно нет
Гораздо стремнее то, что обычно всё-таки стейтменты кэшируются чтобы не парсить каждый раз (это лишний раундтрип к базе поэтому объявляется всё же scoped_ptr<DbStream> statement, но в результате код вида "if (!statement)" делает совсем не то, что кажется, а правильный код ("if (!*statement)") выглядит стрёмно. Я бы лучше писал statement.has_results каждый раз.
Алсо, ещё было бы неплохо потребовать чтобы юзер делал statement >> db::end_of_record после каждой записи. И statement.discard_rest или statement.assert_exhausted. Потому что дико стремает что после какого-нибудь отловленного и отрепорченного глюка все следующие запросы сломаются дико удивительным образом.
Оставить комментарий
tamusyav
В фабричных классах, как правило, имеется один порождающий метод. Если он один, то его же, вроде, можно сделать оператором преобразования типа в указатель на порождаемый объект? Или это грабли? Если да, то где?