LINUX.ORG.RU

подскажите по классам реализацию

 


0

1

Привет.

Cтоит задача, по сокету общаться с пятью типами клиентов. У каждого свой протокол. Я делаю общий класс для пяти протоколов(поля общие, методы как виртуальные). От этого класса наследуюсь и определяю класс для каждого типа клиента. Во время первого коннекта клиента я еще не знаю, какой тип клиента, но в этот момент я хотел бы создать класс соединения(может быть как то экземпляр базового класса), а потом его как то подменить на конкретный тип соединения. Можно это сделать как то красиво что ли или правильно?

Способ решения,создавая указатель на базовый класс, я знаю. Хочется услышать мнения опытных товарищей.



Последнее исправление: beastie (всего исправлений: 3)

Действительно ли есть необходимость создание экземпляра класса до окончания установки соединения с клиентом (выяснение протокола клиента и т.п.)? Какие задачи в этот момент должен решать экземпляр базового класса?

trex6 ★★★★★
()
Ответ на: комментарий от false

нет, чтобы сервер мог понять кто приконектился, сервер новому клиенту посылает набор из пяти упакованных init(типа представься) сообщений

plusPlus
() автор топика
Ответ на: комментарий от plusPlus

Я бы выделил отдельный класс, который бы обслуживал установку соединения с клиентом. После установки соединения создавал бы новый экземпляр для установленного соединения.

Насколько я понимаю, протокол для всех клиентов на этапе установки соединения общий? Возможно подойдет замена наследования на хранение внутри класса-соединения указателя на реальный обработчик. Что-то типа http://www.insidecpp.ru/patterns/pimpl_idiom

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Я бы выделил отдельный класс, который бы обслуживал установку соединения с клиентом. После установки соединения создавал бы новый экземпляр для установленного соединения

+1

false ★★★★★
()
Ответ на: комментарий от trex6

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

plusPlus
() автор топика
Ответ на: комментарий от anonymous

(Да, там просто вырезка из книги современное проектирование на С++ Александреску)
Ещё в класс можно кинуть фабрику, а она при первом гете к полю с реализацией протола выдаст нажный инстанс и будет впредь отдавать его, так как ты настроил её походу выяснения.

anonymous
()
Ответ на: комментарий от plusPlus

точнее, pimpl подойдет, но уже потом, когда я определю, кто есть кто.

plusPlus
() автор топика

Я тебя всё равно не понимаю. Отправляешь свои пять пакетов клиенту, слушаешь ответ, выбираешь нужный интерфейс общения. Что не так-то?

false ★★★★★
()
Ответ на: комментарий от false

ну в тот момент, пока я не знаю, кто есть кто, я же не могу создать экземпляр под конкретного клиента?! а хочется уже на стадии первого коннекта к серверу иметь класс(детектор), а потом его как то подменить на экземпляр под конкретного клиента

plusPlus
() автор топика
Ответ на: комментарий от plusPlus

а хочется уже на стадии первого коннекта к серверу иметь класс(детектор)

Ну тут мне кажется только libastral поможет.

false ★★★★★
()

А что мешает разбросать по разным портам?

ziemin ★★
()
Ответ на: комментарий от plusPlus

что, зачем и по каким портам разбросать))

По разным tcp портам, как все обычно и делают. На одном - один протокол.

ziemin ★★
()
Ответ на: комментарий от plusPlus

а хочется уже на стадии первого коннекта к серверу иметь класс(детектор), а потом его как то подменить на экземпляр под конкретного клиента

дак и имей класс детектор, а после определения типа клиента отдавай этот детектор в качестве жертвы на фабрику.

anonymous
()

Я делал такое при помощи in-place new. Потом, кажется, переписал по-человечески :-)

(про себя) ну вот, сейчас научу людей нехорошему :-)

В общем, если ограничить это извращение (а это, да, извращение) тонким, предсказуемым в поведении и размере объектов уровне, вероятно, реализованном на шаблонах, то вполне можно организовать такую схему. Вы сначала инстанциируете базовый класс, а потом, после определения, что за тип реально требуется, на том же месте и тех же данных инстанциируется класс-наследник. Только, повторюсь, действовать надо аккуратно, и известно, что такие ювелирные штуки должны быть маленькими, простыми, иначе они умрут, загадив своими ошмётками всё вокруг, уже на следующем цикле разработки/рефакторинга.

AlexM ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.