Сейчас на форуме: vsv1 (+5 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Ссылка не указывает на невертуальный метод |
Посл.ответ | Сообщение |
|
Создано: 26 февраля 2016 00:19 · Поправил: bolvai · Личное сообщение · #1 Столкнулся с тем что ссылка в классе не указывает на реализующий метод, а указывает на виртуальный(Т.е пустой). Все дело в том что реализация этого метода задана специфично, по средствам наследования класса(А не в CPP), т.е в классе Archive задается virtual void Read{}; А далее задается ArchiveReader : public Archive и в нем уже реализуется виртуальный void Read{со всей логикой}; и я не пойму ввиду чего но ссылка на этот самый ArchiveReader не идет. Объявлено все следующим образом Code:
Code:
Code:
Собственно я пробовал сделать переопределение внутри Archive, чтобы указать сразу на ArchiveReader , но что то у меня с этим постоянно затруднения возникают. Code:
Помогите плиз ![]() |
|
Создано: 26 февраля 2016 02:23 · Личное сообщение · #2 |
|
Создано: 26 февраля 2016 12:59 · Личное сообщение · #3 Dart Sergius пишет: у тебя классы разные как бы. Или покажи полную цепочку наследования. Да нет они теже просто немного ошибся ! Я пользуюсь тем что есть, это не мой код, но он работает только в VS 2005, я пытаюсь его обрезать и приспособить для VS 2013 но не очень успешно как видно. Что еще мне скинуть ? ![]() |
|
Создано: 26 февраля 2016 15:54 · Личное сообщение · #4 bolvai в последнем большом куске кода обрати внимание на то что метод Read у тебя НЕ виртуальный. Соответсвенно когда базовые методы вызывают ВИРТАУЛЬНЫЙ метод - то они НЕ вызовут твою обычную перегруженную функцию. Укажите virtual. Ну хорошо бы конечно хотя бы хедеры показать полностью и часть cpp - где собственно и как вызываете и что показывает в отладчике... ![]() |
|
Создано: 26 февраля 2016 15:55 · Поправил: redlord · Личное сообщение · #5 Code:
код должен напечатать ok в консоли ![]() |
|
Создано: 26 февраля 2016 16:51 · Поправил: bolvai · Личное сообщение · #6 Dart Sergius пишет: Ну хорошо бы конечно хотя бы хедеры показать полностью и часть cpp - где собственно и как вызываете и что показывает в отладчике... Я привел часть из CPP - оператор как раз там реализован Code:
Code:
Summary.Tag это INT значение, по сему идет переключение в Archive& operator<<(Archive& Ar, int& I), а оттуда уже оно светит в Ar.ByteRead, где собственно в дебаге показывает что оно указывает на void read Arhive Virtual, вместо void ArchiveReader, причем в дебаге от 2005 с оригиналом там все показывает нормально. redlord пишет: int main() { ArchiveReader d; int x = int(); d << x; } Тут как раз с переопределением и вся проблема - при таком написании - выдает ошибку, для класса не существует конструктора по умолчанию. ![]() |
|
Создано: 26 февраля 2016 16:56 · Поправил: redlord · Личное сообщение · #7 |
|
Создано: 26 февраля 2016 17:32 · Поправил: bolvai · Личное сообщение · #8 redlord пишет: Archive* Ar; /// что это? указатель на что? Да указатель на другой метод CreateFileReader, с ним особых накладок нету, да и в принципе не в нем дело. Я мог и объявить просто Archive Ar; ReadFile(Infile,&Ar,size,0); Ar << x; И ссылка в операторе Ar.ByteRead(&I, sizeof(I)); всеравно бы указывала на пустой виртуальный метод вместо того что в ArchiveReader; Наверное это какие то особенности настроек того проекта от Vs 2005, которые я не очень замечаю =( . Вот собственно еще кода из ArchiveReader забыл добавить конструктор Code:
Тут проблема в том что есть переменные в стеке Handle Error size, Которые создаются вот тут Code:
И по сути правильное обращение из Main выглядит так Code:
ибо то что идет в INT Оператор Code:
Не допускает дописания Handle error и size, а получить их неоткуда. Не пойму как оно в оригинале все переопределялось правильно ? ![]() |
|
Создано: 26 февраля 2016 17:41 · Личное сообщение · #9 bolvai операторы не могут быть виртуальными если что. bolvai пишет: а получить их неоткуда. что вам мешает их взять из FArchive& Ar ? Ваще какая-то каша здесь происходит. В начале у вас была проблема с вызовом виртуальной функции ( вызывалось не та ). Сейчас вы оператором бинарного сдвига читаете какую-то структуру ( на которую наверняка не написан оператор ). Теперь вы в операторе бинарного сдвига создаете объект ( хотя вам передают в параметрах объект ), что-то с него пытаетесь прочитать и возвращаете глобальную переменную????? Что за наркомания, простите пожалуйста ? ![]() |
|
Создано: 26 февраля 2016 17:47 · Личное сообщение · #10 Dart Sergius пишет: Ваще какая-то каша здесь происходит. В начале у вас была проблема с вызовом виртуальной функции ( вызывалось не та ). Сейчас вы оператором бинарного сдвига читаете какую-то структуру ( на которую наверняка не написан оператор ). Теперь вы в операторе бинарного сдвига создаете объект ( хотя вам передают в параметрах объект ), что-то с него пытаетесь прочитать и возвращаете глобальную переменную????? Это я так решить пытался, дело та тут в том что Ar.ByteRead(&I, sizeof(I)); как раз и есть та проблема с вызовом виртуальной функции - вместо той что в ARchiveReader, т.е этого почему то не происходит, я пытался представить ArchiveReader, но да это глупость. из Оператора Archive << оно попадает суда Code:
а Read Должно быть не виртуальным от Archive а с фуникцоналом от ArchiveReader, но опять же этого не происходит. ![]() |
|
Создано: 26 февраля 2016 17:53 · Личное сообщение · #11 bolvai тогда кастуй. Code:
Вы обозвали в базовом классе виртуальную функцию, и удивляетесь почему в базовом классе не вызвается НЕВИРТУАЛЬНАЯ функция наследника ? Откуда базовый класс будет знать о ней? Почему не сделаете нормальную виртуальную функцию в наследнике - в которой вызовите все что угодно? ![]() |
|
Создано: 26 февраля 2016 18:00 · Личное сообщение · #12 Dart Sergius пишет: Вы обозвали в базовом классе виртуальную функцию, и удивляетесь почему в базовом классе не вызвается НЕВИРТУАЛЬНАЯ функция наследника ? Откуда базовый класс будет знать о ней? Почему не сделаете нормальную виртуальную функцию в наследнике - в которой вызовите все что угодно? Я ориентируюсь по тому коду что в оригинале ) особо не из чего было выбирать, там видно какие то особые настройки странно как то. сейчас попробую с кастом. ![]() |
|
Создано: 26 февраля 2016 18:24 · Поправил: redlord · Личное сообщение · #13 Dart Sergius пишет: не вызвается НЕВИРТУАЛЬНАЯ функция наследника отсутствие virtual у функции в классе наследнике не делает ее невиртуальной bolvai код ниже работает как и ожидалось. VS2008, EDG 4.10 можно создать проект новый и компильнуть код Code:
bolvai пишет: Я мог и объявить просто Archive Ar; вот тогда точно никакой виртуальности не будет. ![]() |
|
Создано: 26 февраля 2016 21:41 · Поправил: bolvai · Личное сообщение · #14 redlord пишет: код ниже работает как и ожидалось. VS2008, EDG 4.10 можно создать проект новый и компильнуть код Спасибо разобрался! там был специфичный new оператор, из-за которого все почему то падали, поскольку не было игнора MSTRLIB; return new(TEXT("WindowsFileReader"))ArchiveFileReader(Handle, Error, GetFileSize(Handle, NULL)); Сделал по проще return new ArchiveFileReader(Handle, Error, GetFileSize(Handle, NULL)); и убрал переопределение операторов и заработало - спасибо! P.S. Вот только блин какой то баг там возникает с массивами( тоже кастомные) почему то падает постоянно, при простой инициализации их, стоит опять создать отдельную тему ? ![]() |
|
Создано: 26 февраля 2016 22:07 · Поправил: redlord · Личное сообщение · #15 |
|
Создано: 26 февраля 2016 23:09 · Поправил: bolvai · Личное сообщение · #16 redlord пишет: Возможно, это поможет понять, что валит массивы Возможно конечно что Operator new и валит ибо массивы частично Code:
именно так и инициализируются, но мне кажется что это не то, поскольку если я просто объявлю даже std::vector просто вот так, вот программа падает, щас конечно возьмусь за дебагер и постараюсь понять, но там что то указывало на alloc, возможно всетаки какое то еще переопределение все ломает. P.S. Мне тут хоть реально помогают и чему то новому обучаюсь, чего нельзя сказать о других форумах где я кое что хотел узнать... тут как то по умнее чтоли. ![]() |
|
Создано: 26 февраля 2016 23:29 · Личное сообщение · #17 |
|
Создано: 26 февраля 2016 23:54 · Личное сообщение · #18 Dart Sergius пишет: а вы уверены что вам нормальные сырцы дали? Оно как-то работало? Этот new размещает объект ArchiveFileReader на месте строки "WindowsFileReader" !!! Сорцы то те, это я просто видно что то не добавил, либо добавил не правильно, там в оригинале ArchiveFileReader находиться в файле FFileManagerWindows.h, а то откуда он вызывается Core.cpp, не имеет include FFileManagerWindows, оно даже там закоменчено, но темнеменее ссылка имеется! Я проверял все другие include в core.cpp И они не вели к FFilemanagerWindows, пока что мистика это. Вроде бы моя замена не каких проблем не создает, попробую пока что так. ![]() |
|
Создано: 27 февраля 2016 00:35 · Поправил: redlord · Личное сообщение · #19 |
|
Создано: 27 февраля 2016 01:33 · Личное сообщение · #20 redlord пишет: например, джосатис - вандервуд. книжка про шаблоны, но она единственная, где грамотно расписаны тонкости языка. чувствуете разницу межде declaration и definition? ![]() А на счет этих массивов я разобрался) опять ерундовая помеха - надо было проинициализровать его, а я его этого не знал =), ибо опятьжеж сурс не мой) адаптируюсь. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Ссылка не указывает на невертуальный метод |