![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
knut |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
Добрый день.
Вот столкнулся с такой проблемой. Есть класс наследник класс CSomeClass(наследноков много) и есть класс CParser у класса CParser есть метод void Load(const char*pFilename) // загрувает xml фаил. Теперь в конструкторе CSomeClass в вызваю метод CParser a Load(const char*pFilename) чтоб прочетать из фаила данные и инецализировать мемберы класса CSomeClass а. Вопрос. Как передаьт в Load метод обект SomeClass а ?в качестве парамерта Load a нельзя.
--------------------
|
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Класс-родитель ничего не знает о методах и свойствах наследника.
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Объект нельзя, а локальный параметр типа AnsiString можно
|
|||
|
||||
knut |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
а ему и не надо --------------------
|
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Vyacheslav |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Что то тут с логикой не то.
Я подобную систему решалпримерно так. Исходим из того, что cParser - это SAX парсер и при распарсивании он генерит события Тогда
А вообще можно еще определить оператор >>
-------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
knut |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
есть класс cParser
елсть класс
теперь если xотим создать обект т.е ( добавляем элемент в xml ) cSomeClass *pt = new cSomeClass; a в конструкторе cSomeClass вызеваем Аdd_Element(...,pt) создали элемент и добавили в фаил. Собственно и вот проблема. Надо инизализовать мемберы cSomeclass a после того как добавили элемент в фаил. --------------------
|
||||||
|
|||||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Не кажется Вам , что в эти два абзаца описывают совершенно противоположные процессы? Первый абзац описывант процедуру создания объекта и иyциализации его членов, данными из xml, что очень близко напоминает десериализацию Второй абзац больше похож на обратный процесс. Или я опять ничего не понял? -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Если в метод Add_Element должен передаваться объект некого класса, у которого этот метод должен произвести инициализацию некоторых полей и свойств, значит Add_Element должен знать эти свойства для каждого переданного класса.
Либо он должен знать что сделать с каждым конкретным классом, либо для него это должен быть один некий класс с известными ему свойствами. 1 Вариант Следовательно все эти свойства должны находиться в базовом классе, и этот метод спокойно их инициализирует. А передавать ему нужно объект базового класса. 2. Вариант Если все производные классы, передаваемые в метод Add_Element имеют различные методы, которые требуются инициализировать - то тогда этот метод должен знать структуру переданного ему объекта. Т.е. в таком случае они тоже должны иметь общий базовый класс, а в методе Add_Element при помощи dynamic_cast определеять конкретно какого класса объект был ему передан и инициализировать его. |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
И при добавлении нового класса каждый раз переписывать Add_Element ![]() Я же показал выше код, который относительно усешно решает такую задачу. При этом Parser понтия не имеет с полях, которые он инициализирует -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Полностью согласен - поэтому предложил 1-й вариант более предпочтительнее - примерно то же самое, что и у вас, только несколько упрощеннее и менее функционально, естественно. Т.е. в базовом классе либо находятся заранее известные поля, либо заранее известные методы (виртуальные), которые известны и вызываются из парсера. При написании порожденного класса либо надо зарегистрировать методы установки либо переопределить виртуальные - все зависит от конкретного применения. Ваш метод более универсален, мой метод проще для понимания. |
|||
|
||||
knut |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 7.2.2006 Репутация: нет Всего: нет |
если при создание обектаов (наследников) полья классов иницализуются одинакого (для каждого класса)то то почему не иницализовать иx прям в конструкторе а потом при вызове Аdd_Elemet() получить иx и записать в фаил.
P.S по моему это в полне логичная организаьцыя ![]() ![]() --------------------
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |