47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|||||||||||
1 | |||||||||||
Перегрузка fstream в дочернем классе30.10.2014, 18:01. Показов 3240. Ответов 37
Метки нет (Все метки)
h
Пытался унаследовать что StudentsBD, что StudentManipulation- в котором и приисходит работа с файлом реакции некакой, вообще не реагирует на перегрузку, ставил брек поинт что бы остановливалось в методах этих перегрузки, вобще оно их пропускает( Что я делаю нетак?
0
|
30.10.2014, 18:01 | |
Ответы с готовыми решениями:
37
Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе Ошибка в дочернем классе Переопределенные операторы в дочернем классе Использование переменных базового класса в дочернем классе |
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|
30.10.2014, 20:28 [ТС] | 21 |
при том что мне надо перегрузить операторы
<< >> для fstream что бы они до того как в стринг переменную записали, или вывели в стринг. Отредактировали текст. ехх ну что так сложно обяснить. Причем тут перегрузка простого метода Добавлено через 3 минуты да я бы мог вобще хоть 100 способов придумать в каких местах и как еще до записи или вывода отредактировать данные в нащадке перегружая метод записи вывода который написан в отце. Но в задании сказано так продемонстрировать, как можно изменять формат хранения данных в файле без внесения изменений в функционал классов Student, StudentsBD. Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных. Один из потомков в своих методах может использовать перегружены операции >> и << ввода \ вывода объектов класса Student в файл. да я без обьектов чтение сделал а только запись в которой не записивается обьект сам а кидается в стринг переменную его содержимое дак что стринг
0
|
alsav22
|
30.10.2014, 20:51
#22
|
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|
30.10.2014, 22:02 [ТС] | 23 |
походу да) Сорри бывает иногда пишу на другом языке)( ну и наоборот
в переводе потомок Добавлено через 1 час 5 минут жаль так ответа и не получил)
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
||||||
30.10.2014, 22:22 [ТС] | 25 | |||||
Добавлено через 2 минуты вот и говорю перегружаю в потомке, потом создаю обьект потомка и вызиваю унаследованый метод вывода, но выводит без редактирования тоесть без перегрузки которую я описал в чилде который и вызвал(
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
||||||
30.10.2014, 22:50 [ТС] | 27 | |||||
Я писал что я
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
30.10.2014, 22:55 | 28 |
Вы много, что писали. Я смотрю на код в 18 посте.
Что, где, как делали? Реакции на что? Пустой разговор. Ясновидящих нет, кода мало (и то такой, то уже другой), запутанных вопросов много. Прогноз неблагоприятный.
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
||||||||||||||||
30.10.2014, 23:15 [ТС] | 29 | |||||||||||||||
по идее должно добавлять пустое место ибо в перегрузке v=""; но добавляет нормально типа то что передается, тоесть перегрузка не приисходит. может дело в том что она ввобще не вызивается. брекпоинт в ней ставил дебажил, проходит мимо ее
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|
30.10.2014, 23:51 [ТС] | 31 |
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|||||||||||||||||||||
31.10.2014, 00:51 | 32 | ||||||||||||||||||||
Сообщение было отмечено Lynatik001 как решение
Решение
Так.
Во-первых, вы пытаетесь перегрузить операторы вывода для аргументов типа 'fstream' и 'string'. Это оператор уже перегружен в стандартной библиотеке. Даже если вы все сделаете правильно, подобные развлечения только приведут к неприятным последствиям в будущем. Кто-то захочет вызвать стандартный оператор, в попадет на ваш. Лучше прекратите это безобразие. Во-вторых, ваш код, похоже, страдает от того, что вы не понимаете, как работает friend-объявление. (Это неудивительно, так как вещь это весьма неинтуитивная.) Friend-объявление функции, которая как известно располагается внутри класса, но функция из этого friend-объявления членом класса не является. Эта функция будет располагаться снаружи класса, в пространстве имен, в котором сидит класс. Но friend-объявление само по себе не вводит в это наружное пространство имен объявления этой функции. Посмотрите на этот пример
Однако, несмотря на то, что мы определили функцию '::foo(int)', в этом примере из функции 'main' будет вызываться функция '::foo(double)'. Почему? А потому, что несмотря на то, что friend-объявление определяет глобальную функцию '::foo(int)', за пределами класса '::foo(int)' является "невидимой". 'main' ничего не знает о существовании '::foo(int)' и поэтому вызывает '::foo(double)'. Для того, чтобы '::foo(int)' стала видимой снаружи класса 'S', ее надо там снаружи явно объявить (можно до класса, можно после - это не важно)
То же самое происходит в вашем примере. Вы объявили глобальные функции-друзья в классе 'Child'
Но, еще раз повторяю, ваша попытка "захватить" стандартный оператор добром не кончится. P.S. Это правило (про необходимость внешнего объявления) условно "отменяется" в тех ситуациях, когда хотя бы один из аргументов friend-функции имеет тот же тип, что и охватывающий класс. Тогда на помощь приходит специальный механизм, известный как argument-dependent lookup (ADL). Этот механизм найдет friend-функцию даже если она не объявлена снаружи класса. Но в вашем случае ADL помочь не может, потому что ни один из аргументов ваших friend-функций не имеет тип 'Child'. Поэтому в вашем случае внешнее объявление обязательно.
1
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
||||||
31.10.2014, 01:29 | 34 | |||||
Ну так это же два разных файла - .h и .cpp.
В программе в разнообразные посторонние единицы трансляции (в другие .cpp файлы) будет включаться именно .h файл. Эти посторонние единицы трансляции ничего не знают о вышепроцитированном .cpp файле. Все, что видят посторонние единицы трансляции - это .h файл, в котором сказано
Именно в .h файле (!) дополнительно должны быть сделаны наружные объявления этих функций, как я показывал выше. Определения пусть остаются в .cpp файле, как сейчас. Его менять не надо. А вот в .h файл наружные объявления надо добавить.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
31.10.2014, 01:44 | 36 |
30-й пост - это уже интереснее! Однако, что-то я слабо верю.
В 30-м посте функции определены прямо в .h файле. Эти функции - не inline, и не шаблоны. Если такой .h файл включить в несколько .cpp файлов проекта, то компиляция проекта не пройдет - она накроется на стадии линковки из-за множественного определения функций. Спрашивается: каким образом ТС умудрился это скомпилировать? И компилировал ли ТС это вообще? (По 30-му посту, кстати, хорошо видна порочность всей затеи, о которой я говорил ранее. Строчка 'fstr << v' будет вызывать рекурсивно все тот же 'operator <<'. Т.е. эта реализация бесконечно рекурсивна.) Скорее всего, ТС не включал свой .h файл даже туда, где он нужен. Я не вижу включения 'Child.h' нигде в посте 30. Поэтому его проект успешно компилировался (несмотря на определения функций в .h файле), а перегруженные версии операторов не вызывались.
0
|
alsav22
|
31.10.2014, 01:49
#37
|
0
|
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
|
|
31.10.2014, 02:21 [ТС] | 38 |
вот он ответ, спасибо, а то что-то все вдруг запутались) и на 2 страницы ростянулась непонятница) не стану проверять, забыл на это и перегрузил просто методы
Добавлено через 26 минут все компилировалось, просто сама перегрузка не вызивалась, как вы говорили не видило ее.
0
|
31.10.2014, 02:21 | |
31.10.2014, 02:21 | |
Помогаю со студенческими работами здесь
38
Не могу в дочернем классе вызвать protected метод Изменение информации в дочернем классе, через ссылку Можно ли как-то в дочернем классе получить указатель родителя? перегрузка fstream Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |