Фабрика (С++)

tamusyav

В фабричных классах, как правило, имеется один порождающий метод. Если он один, то его же, вроде, можно сделать оператором преобразования типа в указатель на порождаемый объект? Или это грабли? Если да, то где?

Serab

1. херовая читабельность
да в принципе этого достаточно.

tamusyav

Не скажу, что такой ответ меня удовлетворяет (хотелось бы более конкретный пример но, вроде, сам понял: в коде типа такого
Factory f;
Object* a = f;
Object* b = f;
не очевидно, что a и b указывают на разные объекты.
Все равно спасибо :)

kokoc88

не очевидно, что a и b указывают на разные объекты.
Не очевидно, что делать, когда метод принимает аргументы.

bleyman

Чувак, ставь Trigger Warning перед таким кодом, пожалуйста! У меня PSTD!

jakal222

я недавно наткнулся на objective c c++ преобразование:
 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) метод, куда понятнее

bleyman

Я недавно наткнулся на отличнейший код типа такого:

DbStream statement("select id from blah where name = :1")
statement << name;
statement >> id;
delete statement;

Он, кстати, отлично работает (пока маппинг name -> id уникален).

PooH

кстати, очень выразительно!
пойду в свою модель данных в php внедрю похожий интерфейс :)

ava3443

У нас весь C++ код, работающий с базой, выглядит именно так.
Ну, почти так - всё-таки bind-переменные именованные и типизированные.
И delete конечно нет :)

bleyman

Да, довольно мило, но в случае плюсов идея сделать так чтобы можно было писать while (statement) ... оказалась дикой ошибкой. То, что можно delete statement вызвать в результате этого (потому что в плюсах bool является интегральным типом, что приводит к дичайшим проблемам если оверлоаднуть каст к bool, поэтому пацаны оверлоадят каст к void*, а delete NULL по стандарту ОК, так что вот так эта хрень работает (или не работает, если запрос вернул более одного ответа так вот, это пофиг.
Гораздо стремнее то, что обычно всё-таки стейтменты кэшируются чтобы не парсить каждый раз (это лишний раундтрип к базе поэтому объявляется всё же scoped_ptr<DbStream> statement, но в результате код вида "if (!statement)" делает совсем не то, что кажется, а правильный код ("if (!*statement)") выглядит стрёмно. Я бы лучше писал statement.has_results каждый раз.
Алсо, ещё было бы неплохо потребовать чтобы юзер делал statement >> db::end_of_record после каждой записи. И statement.discard_rest или statement.assert_exhausted. Потому что дико стремает что после какого-нибудь отловленного и отрепорченного глюка все следующие запросы сломаются дико удивительным образом.
Оставить комментарий
Имя или ник:
Комментарий: