Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 167 168 [169] 170 171 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2522
,
|
|
|
|
DesweR, поздравляю
|
|
Сообщ.
#2523
,
|
|
|
|
Цитата Qraizer @ Круто. Давно ждали? Добавлено Вчера, 21:00 Вы, кстати, можете нам вернуть. Тоже всё дождаться не могли. Эх. Два года обещали. На самом деле не так уж и нужны 64 бита, области достаточно узкие. Сделали хорошо по первому взгляду. Радует еще то, что в драйверах БД мелькает поддержка MacOS X, RTL-то давно переведена... Поздравляем с долгожданным стандартом |
|
Сообщ.
#2524
,
|
|
|
|
кстати, прошу простить за некрофилию, но недавно обратил внимание, что в VB with реализован значительно прямее, чем в делфи =) кто не знает: в VB синтаксис with таков:
![]() ![]() With object .member1 ... .member2 ... ... End With (для полей таблиц вместо '.' используется '!'. т.е. член класса объекта object никак не может перекрыть формальные параметры или локальные переменные процедуры =) интересно, у MS это случайно получилось или таки они продумали? =) вот еще мини-задачка: есть перечисление размера m (m значений) и перечисление размера n и соответственно два поля класса этих типов-перечилений, A и B, например. нужно реализовать n*m методов(процедур, без параметров и возвращаемых значений) и один метод (назовем его dispatch), который в зависимости от значений A и B. я вижу три варианта: 1. просто реализуем dispatch с помощью switch/if -- просто, но не декларативно => относительно трудночитаемо и плохорасширябельно 2. юзаем паттерн Visitor (в виду отсутствия мультиметодов, они бы тут как раз подошли) -- легкорасширябельно, громоздко и трудночитаемо из за необходимости кучи "предварительных ласк" 3. создаем массив [m][n], в который помещаем указатели на целевые методы. к моей задаче вроде подходит хорошо (суперрасширябельность не нужна + простота реализации). единственное не знаю как получить количество элементов перечислений и задать этими значениями размерность массива. я сам склоняюсь к третьему варианту, но может есть какие-то правильные решения, о которых я не знаю? собственно больше интересует плюсовое решение, т.к. прогу пишу на C++/Qt (сторонники делфи/решетки могут тут попробовать "уделать" плюсовиков, хотя я сомневаюсь, что получится =) ), примерно класс выглядит так: ![]() ![]() enum Foo {X, Y}; enum Bar {A, B, C, D}; class Gee { private: Foo f; Bar b; void mXA (); void mXB (); void mXC (); void mXD (); void mYA (); void mYB (); void mYC (); void mYD (); public: void dispatch (); }; |
|
Сообщ.
#2525
,
|
|
|
|
korvin, почему именно массив, а не map/dictionary? И какой хочется видеть процедуру назначения нужного метода элементу массива?
|
|
Сообщ.
#2526
,
|
|
|
|
Цитата MyNameIsIgor @ korvin, почему именно массив, а не map/dictionary? а зачем тут map/dictionary, когда тут достаточно массива? и я не очень представляю себе двумерный словарь. словарь словарей? или склеивать f и b? Цитата MyNameIsIgor @ И какой хочется видеть процедуру назначения нужного метода элементу массива? ну я думаю просто что-то вроде ![]() ![]() mt[X][A] = &mXA; mt[X][B] = &mXB; ... в конструкторе. |
|
Сообщ.
#2527
,
|
|
|
|
Цитата korvin @ а зачем тут map/dictionary, когда тут достаточно массива? Ну, потому что массивы то достаточно примитивны - они ассоциативны по целому числу. А если вы назначите элементам перечисления какие-то значения, и будет, например, 10, 50 и 100? Как-то не хочется делать массив на хз сколько элементов, если использоваться будет значительно меньше... А словари в этом плане достаточно универсальны. Но массивы быстрее, что, думаю, понятно... Цитата korvin @ и я не очень представляю себе двумерный словарь. словарь словарей? или склеивать f и b? Да, "склеить" неким образом. Например, завести структуру. Или использовать std::pair для плюсов и KeyValuePair для до-диеза. Цитата korvin @ в конструкторе. В смысле на каждый экземпляр класса что ли? А почему не один раз на все экземпляры? |
|
Сообщ.
#2528
,
|
|
|
|
![]() ![]() type TFoo = (X,Y); type TBar = (A,B,C,D); const // gee messages GM_POS = 8; GM_XA = WM_USER+DWORD(X) shl GM_POS+WORD(A); GM_XB = WM_USER+DWORD(X) shl GM_POS+WORD(B); GM_XC = WM_USER+DWORD(X) shl GM_POS+WORD(C); GM_XD = WM_USER+DWORD(X) shl GM_POS+WORD(D); GM_YA = WM_USER+DWORD(Y) shl GM_POS+WORD(A); GM_YB = WM_USER+DWORD(Y) shl GM_POS+WORD(B); GM_YC = WM_USER+DWORD(Y) shl GM_POS+WORD(C); GM_YD = WM_USER+DWORD(Y) shl GM_POS+WORD(D); type TGee = class(TObject) private FFoo:TFoo; FBar:TBar; procedure mXA(var Message); message GM_XA; procedure mXB(var Message); message GM_XB; procedure mXC(var Message); message GM_XC; procedure mXD(var Message); message GM_XD; procedure mYA(var Message); message GM_YA; procedure mYB(var Message); message GM_YB; procedure mYC(var Message); message GM_YC; procedure mYD(var Message); message GM_YD; public procedure Dispatch; reintroduce; end; procedure TGee.Dispatch; var Message:TMessage; begin Message.Msg:=WM_USER+DWORD(FFoo) shl GM_POS+WORD(FBar); inherited Dispatch(Message); end; работает... с константами конечно не очень красиво, но никаких доп.данных в классе... |
|
Сообщ.
#2529
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, потому что массивы то достаточно примитивны - они ассоциативны по целому числу. А если вы назначите элементам перечисления какие-то значения, и будет, например, 10, 50 и 100? Как-то не хочется делать массив на хз сколько элементов, если использоваться будет значительно меньше... А словари в этом плане достаточно универсальны. Но массивы быстрее, что, думаю, понятно... не назначу, они не нужны мне как псевдонимы для каких-то магических чисел, а вполне устраивают в своем дефолтном виде. Цитата MyNameIsIgor @ Да, "склеить" неким образом. Например, завести структуру. Или использовать std::pair для плюсов и KeyValuePair для до-диеза. но это опять усложняет код и при этом не дает значительных преимуществ (в данном случае). основной критерий -- простота и читабельность; гибкость особа не нужна. Цитата MyNameIsIgor @ В смысле на каждый экземпляр класса что ли? А почему не один раз на все экземпляры? да, лучше, конечно один раз, я просто не знаю, где нужно в таком случае прописать код инициализации. Добавлено Цитата Shaggy @ ![]() ![]() type TFoo = (X,Y); type TBar = (A,B,C,D); const // gee messages GM_POS = 8; GM_XA = WM_USER+DWORD(X) shl GM_POS+WORD(A); GM_XB = WM_USER+DWORD(X) shl GM_POS+WORD(B); GM_XC = WM_USER+DWORD(X) shl GM_POS+WORD(C); GM_XD = WM_USER+DWORD(X) shl GM_POS+WORD(D); GM_YA = WM_USER+DWORD(Y) shl GM_POS+WORD(A); GM_YB = WM_USER+DWORD(Y) shl GM_POS+WORD(B); GM_YC = WM_USER+DWORD(Y) shl GM_POS+WORD(C); GM_YD = WM_USER+DWORD(Y) shl GM_POS+WORD(D); type TGee = class(TObject) private FFoo:TFoo; FBar:TBar; procedure mXA(var Message); message GM_XA; procedure mXB(var Message); message GM_XB; procedure mXC(var Message); message GM_XC; procedure mXD(var Message); message GM_XD; procedure mYA(var Message); message GM_YA; procedure mYB(var Message); message GM_YB; procedure mYC(var Message); message GM_YC; procedure mYD(var Message); message GM_YD; public procedure Dispatch; reintroduce; end; procedure TGee.Dispatch; var Message:TMessage; begin Message.Msg:=WM_USER+DWORD(FFoo) shl GM_POS+WORD(FBar); inherited Dispatch(Message); end; работает... с константами конечно не очень красиво, но никаких доп.данных в классе... не вижу преимуществ перед массивом =/ а некоторые участки выглядят слишком магически =/ |
|
Сообщ.
#2530
,
|
|
|
|
Цитата korvin @ а некоторые участки выглядят слишком магически какие? |
|
Сообщ.
#2531
,
|
|
|
|
Цитата Shaggy @ какие? ![]() ![]() вся секция const (и сам факт ее наличия); параметр и директивы методов: (var Message); message GM_XA; директива reintroduce; собственно вся реализация процедуры dispatch; слишком много "лишнего" |
|
Сообщ.
#2532
,
|
|
|
|
Цитата korvin @ секция const; получение идентификатора по двум значениям? ну перепиши так: WM_USER+DWORD(X)*(WORD(High(TBar))+1)+WORD(A); Цитата korvin @ директива reintroduce; это чтобы компилятор не возмущался я перекрыл одноимённый виртуальный метод Цитата korvin @ параметр и директивы методов: (var Message); message GM_XA; Цитата korvin @ собственно реализация процедуры dispatch полностью; а это, извини, в букварь... |
|
Сообщ.
#2533
,
|
|
|
|
Цитата Shaggy @ получение идентификатора по двум значениям? ну перепиши так: WM_USER+DWORD(X)*(WORD(High(TBar))+1)+WORD(A); ![]() ничем не лучше Цитата Shaggy @ это чтобы компилятор не возмущался я перекрыл одноимённый виртуальный метод эээ, а разве перекрытие виртуального метода стало чем-то необычным, что компилятор должен возмущаться? Цитата Shaggy @ а это, извини, в букварь... лезть ради такой простой вещи в букварь как-то тупо, тем более когда есть более простые решения. |
|
Сообщ.
#2534
,
|
|
|
|
Цитата korvin @ создаем массив [m][n], в который помещаем указатели на целевые методы. к моей задаче вроде подходит хорошо (суперрасширябельность не нужна + простота реализации). единственное не знаю как получить количество элементов перечислений и задать этими значениями размерность массива. Это самое простое. Но только я не понимаю, ведь тебе все равно надо объявить m*n методов, а потом присвоить их индивидуально каждому элементу массива. Количество получается известным. Да, а что, в С++ разве нельзя объявить что-то вроде ![]() ![]() type TA = (X, Y); TB = (A,B,C,D); TMethodArray = array [TA]of array [TB] of TMethod; //двумерный, обращение типа MA[X][C] или MA[X,C] |
|
Сообщ.
#2535
,
|
|
|
|
Цитата korvin @ да, лучше, конечно один раз, я просто не знаю, где нужно в таком случае прописать код инициализации. в том смысле, что, как я понимаю сам массив и процедуру инициализации объявить статичными, но где лучше всего прописать вызов этой процедуры? |