![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Сорри, если код большой но так проблема полностью ясна. У меня пробел в образовании
Можно конечно ввести перпеменные-флаги вначале и в конце блока данных, но отсчитывать смещения таким образом не очень изящно. Есть способ проще? Это сообщение отредактировал(а) DENNN - 8.10.2003, 15:30 |
||||
|
|||||
| setq |
|
|||
|
Unregistered |
а наследование обязательно?
может можно обойтись
и определением метода копирования в SOME_MORE. кажется, проблемма бы решилась... код весь не читал. может я не прав. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Мастер генерит аксессор для доступа к БД через OLE DB. Я вынес сами данные в отдельный класс-родител, чтоб разделить функциональность самих данных и методов их получения через COM. Макрос привязки (BEGIN_COLUMN_MAP) 100% работает нормально когда данные являются непосредственно членами класса. Изменить таким образом определение класса значит нажить возможные проблемы если не сейчас то в будущем при переходе на очередную версию студии. Поэтому желательно сделать именно так
|
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Вообще, это может привести к проблемам в будущем. Вдруг в других компиляторах работать не будет.
А так попробуй привести к одному типу: memcpy (&a, (CGeoObj*)(&b), sizeof(CGeoObj )); |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Мдя, похоже надежней ввести две пустые переменные до начала данных и после них. Тогда memcpy выглядит так (для переменных token1 и token2):
memcpy( (void*)&a.token1, (void*)&b.token1, (size_t)((LPBYTE)&a.token2-(LPBYTE)&a.token1) ); |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Не понял, а мой вариант не катит что-ли?
|
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
А это кто сказал?
|
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
DENNN, всё работает.
Проблема у тебя в том, по-моему, что базовый класс у тебя не содержит виртуальных функций, а наследник, похоже, содержит. Ты их, наверное, просто нам не показал. Я прав? Если да, то возникает такая ситуация. Класс CGeoObj содержит только данные, а класс CGeoObjDBAccessor в первых 4 байтах содержит указатель на vtable, потом класс CGeoObj, а потом свои данные. Чтоб получить указатель на данные CGeoObj выполни приведение типа для указателя на CGeoObjDBAccessor к указателю на CGeoObj. И компилятор возьмёт то, что нужно. P.S. Нужно быть осторожным. Если базовый класс содержит виртуальные функции, то будет заменён указатель на vtable. Таким образом базовый класс будет использовать виртуальные функции наследника и скорее всего возникнет ошибка доступа к памяти, когда эти функции будут обращаться к полям класса CGeoObjDBAccessor, на самом деле отсутствующим в CGeoObj. Во как закрутил |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Я имел ввиду использование memcpy. По-моему, через оператор = будет работать не намного медленнее. P.S. Кстати, мой вариант, по идее, должен работать везде. Сам подумай. После приведения к одному типу, указатели будут указывать на данные, хранящиеся в структуре одного вида. Проблема в том, что memcpy копирует не думая. Поэтому и ссылку на vtable скопирует, не задаваясь вопросами наследования, полиморфизма и прочей "лабуды". |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Нет. Это полная копия кода для обеих классов. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |