Войти
ПрограммированиеФорумОбщее

Проверка существования переменной или функции-члена (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
17:21, 19 дек. 2008

majesty
>Вопрос о проверке на наличие метода(функции-члена) в пределах определенного объекта это набор буков?
К сожалению, это так.
Ты пытаешься писать на С++ как на php.
Во время выполнения в программе, написанной на С++, не существует классов, методов и переменных. Поэтому "проверка начилия метода или переменной" можно написать так:

bool is_mymethod_present()
{
     myclass::mymethod;
     return true;
}

Если метода не существует, будет ошибка компиляции.


#46
17:22, 19 дек. 2008

majesty
>KpeHDeJIb
>Вопрос о проверке на наличие метода(функции-члена) в пределах определенного
>объекта это набор буков?

Конечно набор бессмысленных буковок! Я же тебе уже объяснил как делать. Знаешь (с помощью dynamic_cast) класс - знаешь и объект! ЖЕЛЕЗО!
Вспомни что PHP написан на C, что есть подмножество С++. :)

#47
17:54, 19 дек. 2008

=A=L=X=
Почитаю что такое dynamic_cast, спасибо за ответ.

#48
18:07, 19 дек. 2008

majesty
ты работал только с PHP 4?

#49
23:23, 19 дек. 2008

О господи. Вот скажите мне. Зачем писать функции, если ты даже не можешь запомнить что они делают и когда их вызывать?
Приведи пример, где "Проверка существования переменной или функции-члена" нужна. Желательно несколько.

#50
23:41, 19 дек. 2008

>>typeof
>>Извиняюсь, ошибся. Есть ключевое слово typeid.
typeof- есть, но в GNU'сном компиляторе C++.

#51
0:00, 20 дек. 2008

Fla
Я уже писал зачем. Когда сервер работает с пользователем, он должен выполнять его запросы. Например, игрок запросил атаку, в контроллере будет выполнено что-то вроде pPlayerUnit1->execute("attack", "targetId"); Если в пакете приедет мусор или какой-то из запросов не будет реализован по всей видимости сервер упадет. Я снова не прав?

Хотелось бы подчеркнуть что адекватно ответить попыталось всего несколько человек, вместо этого большинство навязывает свои идеи, которые в большинстве случаев не являются правильными. Я могу ошибаться, но... мое видение реализации той или иной задачи зачастую является влиянием статей Гради Буча и Мартина Фаулера, которых я не считаю глупыми.

#52
0:12, 20 дек. 2008

majesty
> Когда сервер работает с пользователем
Он пересылает ему байты. А что с ними делать решаешь ты.
Допустим сервер принял

{54/*номер объекта, для тебя pPlayerUnit1*/,17/*attack*/, 88 /*твой любимый targetID*/, /*другие параметры*/}
Attack и прочее добро записано в enum'е.
Дальше идет проверка на возможность вызова функции #17 у объекта #54. Это делается без аццких похопе извращений, а через if. Дальше проверяем правильность параметров и их количество. Вызываем.
isset не нужен.

> pPlayerUnit1->execute("attack", "targetId");
Что бы в пакете в ответ на это пришел мусор, ты должен переслать то говно что я процитировал строчкой выше. Зачем пересылать такую страшную строчку? Что бы потом ее парсить?

> Я снова не прав?
В точку. Ты пытаешься реализовать тупой костыль, который никому(?) не нужен.

Опять же спрошу - если ты знаешь какие функции у тебя есть, то зачем проверять? Почему ты проверяешь на существование? Потомучто ты хочешь вызвать функцию которой нет. Зачем?
Приведу пример. У тебя есть N тарелок с супами. Ты прекрасно знаешь где все лежит и сколько соли и перца надо в каждый кинуть.
Но ты все равно заводишь дворецкого, что бы тот тебе каждый раз говорил что "Да, сэр, в этой тарелке борщ, сюда надо положить 2 ложки сметаны" и выкидывал эксепшн при отсутствии рассольника.

Кстати не разу не видел что бы в похапе isset использовался для функций. Для переменных - да видел, и это обусловлено тем, что похапе интерпретируемый и переменные создаются в нем когда хочешь, либо задаются непосредственно через GET/POST. Есть вариант что их не зададут или функция их инициализирующая свалится непосредственно до инициализации и тогда мы узнаем что "переменная еще не задана".
Никогда не видел толку в isset кроме проверки данных в юрле.

#53
0:21, 20 дек. 2008

majesty
Очень грубо говоря, это делается так:

class Player: public Actor
{
 virtual void Attack();
 virtual void Move();
};
...
Player *pPlayer;

...
Packet packet;
Receive(&packet);
if (packet.type == PACKET_ATTACK)
 pPlayer->Attack(...);
else if (packet.type == PACKET_MOVE)
 pPlayer->Move(...);
else if ...
#54
0:23, 20 дек. 2008

Nomad
Во-во, я об этом. Только "моя версия" более расширенная.
Естественно очень грубо, он же с похапе пришел.

#55
1:38, 20 дек. 2008

Nomad
А если у меня действий будет около 100, всеравно if-elseif-else? Кстати, это тот Nomad который писал один известный сервер?

Fla
Я хочу обрабатывать пакеты в отведенном для этого контроллере и преобразовывать в нужный, понятный вид. Если не ошибаюсь, Фаулер, избегает использования switch и больших if-elseif-else конструкций.

В любом случае попробую написать реализацию своего вопроса, может даже поменяю точку зрения. Может моя проблема заключается в специфическом для С++ понятии о ооп и проектировании которое пришло с соответствующей литературы и опыта.

#56
2:10, 20 дек. 2008

majesty
Да, if-else if-else. Для упрощения читаемости/поддержки кода (и, пожалуй. сократить количество if-else в тысячи раз), можно разбить парсер следующим образом:

void (*aPacketParsers[256])(Packet *pPacket);
aPacketParsers[0] = &PlayerEventHandler;     //packet.actor == 0 == ACTOR_PLAYER
aPacketParsers[1] = &SystemEventHandler; //packet.actor == 1 == ACTOR_SYSTEM
...
//получаем пакет, вызываем соответствующий обработчик
Receive(&packet);
(aPacketParsers[packet.actor])(&packet);
...
//глобальные обработчики
void PlayerEventHandler(Packet *pPacket)
{
 //pPacket->actor == ACTOR_PLAYER
 if (pPacket->action == ACTION_PLAYER_MOVE)
   pPlayer->Move(...);
 else if (pPacket->action == ACTION_PLAYER_ATTACK)
   pPlayer->Attack(...);
 else if ...
}

void SystemEventHandler(Packet *pPacket)
{
 //pPacket->actor == ACTOR_SYSTEM
 if (pPacket->action == ACTION_SYSTEM_DISCONNECT)
   Disconnect();
 eles if (pPacket->action == ACTION_SYSTEM_RECONNECT)
 {
  Disconnect();
  Connect();
 }
 else if ...
}

Внутри каждого xxxEventHandler можно сделать такую же вилку для каждого action.

upd: Да. А ещё я пишу рецензии на ag.ru.

#57
3:57, 20 дек. 2008

Nomad
А не лучше ли вместо ифов, сделать массив с указателями на действия сервера, а по акшену вычислять смещение в массиве? Работать будет на много быстрее

#58
4:03, 20 дек. 2008

Fedor
>А не лучше ли вместо ифов, сделать массив с указателями на действия сервера, а по акшену вычислять смещение в массиве? >Работать будет на много быстрее

Nomad
>Внутри каждого xxxEventHandler можно сделать такую же вилку для каждого action.

8)

#59
9:34, 20 дек. 2008

Почитал топик. Создалось впечатление, что суровые C++ники ничего не знают о статической и динамической типизации. ОМФГ.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.