Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Вызов в конструкторе методa класса |
Автор: knut 31.1.2007, 19:22 | ||
Добрый день. Вот столкнулся с такой проблемой. Есть класс наследник класс CSomeClass(наследноков много) и есть класс CParser у класса CParser есть метод void Load(const char*pFilename) // загрувает xml фаил. Теперь в конструкторе CSomeClass в вызваю метод CParser a Load(const char*pFilename) чтоб прочетать из фаила данные и инецализировать мемберы класса CSomeClass а. Вопрос. Как передаьт в Load метод обект SomeClass а ?в качестве парамерта Load a нельзя.
|
Автор: Anikmar 31.1.2007, 19:28 |
Класс-родитель ничего не знает о методах и свойствах наследника. |
Автор: JackYF 31.1.2007, 20:45 | ||
почему? |
Автор: Anikmar 31.1.2007, 20:47 |
Объект нельзя, а локальный параметр типа AnsiString можно |
Автор: knut 1.2.2007, 11:31 | ||
а ему и не надо |
Автор: Daevaorn 1.2.2007, 12:14 |
вот тебе точно надо научиться по человечески задовать вопросы, если хочешь получать на них правильные ответы |
Автор: Vyacheslav 1.2.2007, 13:17 | ||||||
Что то тут с логикой не то. Я подобную систему решалпримерно так. Исходим из того, что cParser - это SAX парсер и при распарсивании он генерит события Тогда
А вообще можно еще определить оператор >>
|
Автор: knut 1.2.2007, 15:18 | ||||
есть класс cParser
елсть класс
теперь если xотим создать обект т.е ( добавляем элемент в xml ) cSomeClass *pt = new cSomeClass; a в конструкторе cSomeClass вызеваем Аdd_Element(...,pt) создали элемент и добавили в фаил. Собственно и вот проблема. Надо инизализовать мемберы cSomeclass a после того как добавили элемент в фаил. |
Автор: Anikmar 1.2.2007, 18:18 |
Если в метод Add_Element должен передаваться объект некого класса, у которого этот метод должен произвести инициализацию некоторых полей и свойств, значит Add_Element должен знать эти свойства для каждого переданного класса. Либо он должен знать что сделать с каждым конкретным классом, либо для него это должен быть один некий класс с известными ему свойствами. 1 Вариант Следовательно все эти свойства должны находиться в базовом классе, и этот метод спокойно их инициализирует. А передавать ему нужно объект базового класса. 2. Вариант Если все производные классы, передаваемые в метод Add_Element имеют различные методы, которые требуются инициализировать - то тогда этот метод должен знать структуру переданного ему объекта. Т.е. в таком случае они тоже должны иметь общий базовый класс, а в методе Add_Element при помощи dynamic_cast определеять конкретно какого класса объект был ему передан и инициализировать его. |
Автор: Vyacheslav 1.2.2007, 18:42 | ||
И при добавлении нового класса каждый раз переписывать Add_Element ![]() Я же показал выше код, который относительно усешно решает такую задачу. При этом Parser понтия не имеет с полях, которые он инициализирует |
Автор: Anikmar 1.2.2007, 19:10 | ||
Полностью согласен - поэтому предложил 1-й вариант более предпочтительнее - примерно то же самое, что и у вас, только несколько упрощеннее и менее функционально, естественно. Т.е. в базовом классе либо находятся заранее известные поля, либо заранее известные методы (виртуальные), которые известны и вызываются из парсера. При написании порожденного класса либо надо зарегистрировать методы установки либо переопределить виртуальные - все зависит от конкретного применения. Ваш метод более универсален, мой метод проще для понимания. |
Автор: knut 1.2.2007, 22:25 |
если при создание обектаов (наследников) полья классов иницализуются одинакого (для каждого класса)то то почему не иницализовать иx прям в конструкторе а потом при вызове Аdd_Elemet() получить иx и записать в фаил. P.S по моему это в полне логичная организаьцыя ![]() ![]() |