Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
1

Перегрузка fstream в дочернем классе

30.10.2014, 18:01. Показов 3240. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
h
C++
1
2
3
4
class Child:public StudentsBD{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
cpp
C++
1
2
3
4
5
6
7
8
fstream &operator << ( fstream & fstr , string &v ){
    fstr << v;
    return( fstr );
}
fstream &operator >> ( fstream & ostr , string &v ){
    ostr >> v;
        return( ostr );
}
У меня есть класс вот етот(Child) он наследует класс(StudentsBD) который работает с обьектом класса(StudentManipulation) который работает с файлом
Пытался унаследовать что StudentsBD, что StudentManipulation- в котором и приисходит работа с файлом
реакции некакой, вообще не реагирует на перегрузку, ставил брек поинт что бы остановливалось в методах этих перегрузки, вобще оно их пропускает(
Что я делаю нетак?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 18:01
Ответы с готовыми решениями:

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot....

Ошибка в дочернем классе
Не могу найти ошибку в дочернем классе, возможно не правильно написать main Задание и код: Код...

Переопределенные операторы в дочернем классе
Всем привет! В общем, столкнулся с проблемой. У меня есть базовый класс в котором переопределены...

Использование переменных базового класса в дочернем классе
Доброго времени суток. Подскажите пожалуйста как в классе SumbString работать с переменными(string...

37
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 20:28  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от alsav22 Посмотреть сообщение
При чём здесь, тогда, ввод\вывод? Так и пишите, что метод добавления (add) нужно перегрузить.
при том что мне надо перегрузить операторы
<<
>>
для fstream что бы они до того как в стринг переменную записали, или вывели в стринг. Отредактировали текст.
ехх ну что так сложно обяснить. Причем тут перегрузка простого метода

Добавлено через 3 минуты
да я бы мог вобще хоть 100 способов придумать в каких местах и как еще до записи или вывода отредактировать данные в нащадке перегружая метод записи вывода который написан в отце. Но в задании сказано так

продемонстрировать, как можно изменять формат хранения данных в файле без внесения изменений в функционал классов Student, StudentsBD. Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных. Один из потомков в своих методах может использовать перегружены операции >> и << ввода \ вывода объектов класса Student в файл.

да я без обьектов чтение сделал а только запись в которой не записивается обьект сам а кидается в стринг переменную его содержимое дак что стринг
0
alsav22
30.10.2014, 20:51
  #22

Не по теме:

Цитата Сообщение от Lynatik001 Посмотреть сообщение
при том что мне надо перегрузить операторы
<<
>>
для fstream что бы они до того как в стринг переменную записали, или вывели в стринг. Отредактировали текст.
ехх ну что так сложно обяснить. Причем тут перегрузка простого метода Добавлено через 3 минуты
да я бы мог вобще хоть 100 способов придумать в каких местах и как еще до записи или вывода отредактировать данные в нащадке перегружая метод записи вывода который написан в отце. Но в задании сказано так
продемонстрировать, как можно изменять формат хранения данных в файле без внесения изменений в функционал классов Student, StudentsBD. Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных. Один из потомков в своих методах может использовать перегружены операции >> и << ввода \ вывода объектов класса Student в файл.
да я без обьектов чтение сделал а только запись в которой не записивается обьект сам а кидается в стринг переменную его содержимое дак что стринг
Я думаю, что:
Цитата Сообщение от Lynatik001 Посмотреть сообщение
zss думаю только вы просветить можете меня
Он, наверное, знает, что такое "нащадка".

0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 22:02  [ТС] 23
Цитата Сообщение от alsav22 Посмотреть сообщение
Он, наверное, знает, что такое "нащадка".
походу да) Сорри бывает иногда пишу на другом языке)( ну и наоборот
в переводе потомок

Добавлено через 1 час 5 минут
жаль так ответа и не получил)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 22:11 24
Цитата Сообщение от Lynatik001 Посмотреть сообщение
жаль так ответа и не получил)
Тут проблема с пониманием того, что нужно. Всё запутанно.
Вот это нужно сделать:
Цитата Сообщение от Lynatik001 Посмотреть сообщение
Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных.
Где потомки класса, с с перегруженными вариантами записи \ чтения данных?
0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 22:22  [ТС] 25
Цитата Сообщение от alsav22 Посмотреть сообщение
Где потомки класса, с с перегруженными вариантами записи \ чтения данных?
C++
1
2
3
4
class Child:public StudentsBD{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
самый первый пост типо неочем не говорит?

Добавлено через 2 минуты
вот и говорю перегружаю в потомке, потом создаю обьект потомка и вызиваю унаследованый метод вывода, но выводит без редактирования тоесть без перегрузки которую я описал в чилде который и вызвал(
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 22:27 26
Цитата Сообщение от Lynatik001 Посмотреть сообщение
самый первый пост типо неочем не говорит?
Ни о чём. Ещё раз:
Цитата Сообщение от alsav22 Посмотреть сообщение
Где потомки класса, с с перегруженными вариантами записи \ чтения данных?
Потомки StudentManipulation:
Цитата Сообщение от Lynatik001 Посмотреть сообщение
Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных.
0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 22:50  [ТС] 27
Цитата Сообщение от alsav22 Посмотреть сообщение
Потомки StudentManipulation:
Я писал что я
C++
1
2
3
4
class Child:public StudentManipulation{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
тоже делал реакции некакой
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 22:55 28
Цитата Сообщение от Lynatik001 Посмотреть сообщение
Я писал
Вы много, что писали. Я смотрю на код в 18 посте.
Цитата Сообщение от Lynatik001 Посмотреть сообщение
тоже делал реакции некакой
Что, где, как делали? Реакции на что?
Пустой разговор. Ясновидящих нет, кода мало (и то такой, то уже другой), запутанных вопросов много. Прогноз неблагоприятный.
0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 23:15  [ТС] 29
Цитата Сообщение от alsav22 Посмотреть сообщение
Пустой разговор. Ясновидящих нет, кода мало (и то такой, то уже другой), запутанных вопросов много. Прогноз неблагоприятный.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include "stdafx.h"
#include "StudentsBD.h"
#include "StudentManipulation.h"
class Child:public StudentManipulation{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
 
fstream &operator << ( fstream & fstr ,string &v ){
    v="";
    fstr << v;
    return( fstr );
}
fstream &operator >> ( fstream & ostr , string &v ){
    v="";
    ostr >> v;
        return( ostr );
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
#include "stdafx.h"
#include <string>
#include <vector>
#include <fstream>
#include "Student.h"
using namespace std;
class StudentManipulation{
public:
     void param(fstream &str2);
     void add(Student student);
     void del(int index);
     void openn(fstream *file);
     void close();
       fstream *str;
       fstream *str2;
      int nextid();
      vector<string> gotext();
      void view();
 
};
 
void StudentManipulation::add(Student student)
{
    string stud = to_string(nextid()) +'|'+ student.surname+'|' + student.name+'|'+ to_string(student.rist)+'|' +to_string(student.vaga)+'|' +to_string(student.ticket)+'|' 
        +student.seriya+"|\n";
    *str << stud;
    //str->clear();
}
вызиваю
C++
1
2
3
4
5
6
                Student st2(surname,name,rist,vaga,ticket,seriya);
                cout << "перегруженный ввод" << endl ;
                fstream s;
                c.openn(&s);
                c.add(st2);
                c.close();
Добавлено через 57 секунд
по идее должно добавлять пустое место ибо в перегрузке v="";
но добавляет нормально типа то что передается, тоесть перегрузка не приисходит. может дело в том что она ввобще не вызивается. брекпоинт в ней ставил дебажил, проходит мимо ее
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 23:30 30
Цитата Сообщение от Lynatik001 Посмотреть сообщение
вызиваю
Выложенный код не компилируется, а поэтому и нет возможности проверить работу. Прогноз неблагоприятный.
0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 23:51  [ТС] 31
Цитата Сообщение от alsav22 Посмотреть сообщение
Выложенный код не компилируется, а поэтому и нет возможности проверить работу. Прогноз неблагоприятный.
ну да класс студент же не кидал, дай скайп кину проект
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
31.10.2014, 00:51 32
Лучший ответ Сообщение было отмечено Lynatik001 как решение

Решение

Цитата Сообщение от Lynatik001 Посмотреть сообщение
тоже делал реакции некакой
Так.

Во-первых, вы пытаетесь перегрузить операторы вывода для аргументов типа 'fstream' и 'string'. Это оператор уже перегружен в стандартной библиотеке. Даже если вы все сделаете правильно, подобные развлечения только приведут к неприятным последствиям в будущем. Кто-то захочет вызвать стандартный оператор, в попадет на ваш. Лучше прекратите это безобразие.

Во-вторых, ваш код, похоже, страдает от того, что вы не понимаете, как работает friend-объявление. (Это неудивительно, так как вещь это весьма неинтуитивная.)

Friend-объявление функции, которая как известно располагается внутри класса, но функция из этого friend-объявления членом класса не является. Эта функция будет располагаться снаружи класса, в пространстве имен, в котором сидит класс. Но friend-объявление само по себе не вводит в это наружное пространство имен объявления этой функции.

Посмотрите на этот пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double foo(double d) {
  return d;
}
 
class S {
  int i;
  S() : i(42) {}
 
  friend int foo(int i) {
    return S().i;
  }
};
 
int main() {
  cout << foo(5) << endl;
}
Friend-объявление внутри класса определяет глобальную функцию '::foo(int)'. Это - важная деталь! Определяем мы тут не 'S::foo(int)', а именно '::foo(int)'!

Однако, несмотря на то, что мы определили функцию '::foo(int)', в этом примере из функции 'main' будет вызываться функция '::foo(double)'. Почему?

А потому, что несмотря на то, что friend-объявление определяет глобальную функцию '::foo(int)', за пределами класса '::foo(int)' является "невидимой". 'main' ничего не знает о существовании '::foo(int)' и поэтому вызывает '::foo(double)'.

Для того, чтобы '::foo(int)' стала видимой снаружи класса 'S', ее надо там снаружи явно объявить (можно до класса, можно после - это не важно)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double foo(double d) {
  return d;
}
 
struct S {
  friend int foo(int i) {
    return i;
  }
};
 
void foo(int i);
 
int main() {
  cout << foo(5) << endl;
}
Теперь из 'main' будет вызываться именно '::foo(int)', определенная внутри 'S'.

То же самое происходит в вашем примере. Вы объявили глобальные функции-друзья в классе 'Child'

C++
1
2
3
4
class Child:public StudentManipulation{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
но, несмотря на то что эти функции являются глобальными, снаружи класса 'Child' эти функции никому не видны. Если вы хотите чтобы они были видны и снаружи, они должны быть дополнительно объявлены снаружи

C++
1
2
3
4
5
6
7
class Child:public StudentManipulation{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
 
fstream &operator<<( fstream&  , string & );
fstream &operator>>( fstream& , string & );
Это надо сделать именно в заголовочном (.h) файле.

Но, еще раз повторяю, ваша попытка "захватить" стандартный оператор добром не кончится.

P.S. Это правило (про необходимость внешнего объявления) условно "отменяется" в тех ситуациях, когда хотя бы один из аргументов friend-функции имеет тот же тип, что и охватывающий класс. Тогда на помощь приходит специальный механизм, известный как argument-dependent lookup (ADL). Этот механизм найдет friend-функцию даже если она не объявлена снаружи класса. Но в вашем случае ADL помочь не может, потому что ни один из аргументов ваших friend-функций не имеет тип 'Child'. Поэтому в вашем случае внешнее объявление обязательно.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2014, 01:25 33
Всё правильно, но в 18 посте (и в 30) выложен код:
Цитата Сообщение от Lynatik001 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "stdafx.h"
#include "StudentsBD.h"
#include "StudentManipulation.h"
class Child:public StudentsBD{
     friend fstream &operator<<( fstream& , string & );
     friend fstream &operator>>( fstream& , string & );
};
...
#pragma once
#include "stdafx.h"
#include "Child.h"
fstream &operator << ( fstream & fstr , string &v ){
    fstr << v;
    return( fstr );
}
fstream &operator >> ( fstream & ostr , string &v ){
    ostr >> v;
    return( ostr );
}
Добавлено через 8 минут
Цитата Сообщение от Lynatik001 Посмотреть сообщение
дай скайп кину проект
Сюда кидай.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
31.10.2014, 01:29 34
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё правильно, но в 18 посте выложен код:
Ну так это же два разных файла - .h и .cpp.

В программе в разнообразные посторонние единицы трансляции (в другие .cpp файлы) будет включаться именно .h файл. Эти посторонние единицы трансляции ничего не знают о вышепроцитированном .cpp файле. Все, что видят посторонние единицы трансляции - это .h файл, в котором сказано

C++
1
2
3
4
class Child:public StudentsBD{
  friend fstream &operator<<( fstream& , string & );
  friend fstream &operator>>( fstream& , string & );
};
А этого мало для того, чтобы друзья были видны снаружи.

Именно в .h файле (!) дополнительно должны быть сделаны наружные объявления этих функций, как я показывал выше. Определения пусть остаются в .cpp файле, как сейчас. Его менять не надо. А вот в .h файл наружные объявления надо добавить.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2014, 01:36 35
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
это .h файл, в котором сказано
C++
1
2
3
4
class Child:public StudentsBD{
  friend fstream &operator<<( fstream& , string & );
  friend fstream &operator>>( fstream& , string & );
};
Смотрим 30-й пост.

Добавлено через 3 минуты
Я к тому, что:
Цитата Сообщение от alsav22 Посмотреть сообщение
кода мало (и то такой, то уже другой)
и без всего кода трудно понять, что там на самом деле происходит.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
31.10.2014, 01:44 36
Цитата Сообщение от alsav22 Посмотреть сообщение
Смотрим 30-й пост.
30-й пост - это уже интереснее! Однако, что-то я слабо верю.

В 30-м посте функции определены прямо в .h файле. Эти функции - не inline, и не шаблоны. Если такой .h файл включить в несколько .cpp файлов проекта, то компиляция проекта не пройдет - она накроется на стадии линковки из-за множественного определения функций.

Спрашивается: каким образом ТС умудрился это скомпилировать? И компилировал ли ТС это вообще? (По 30-му посту, кстати, хорошо видна порочность всей затеи, о которой я говорил ранее. Строчка 'fstr << v' будет вызывать рекурсивно все тот же 'operator <<'. Т.е. эта реализация бесконечно рекурсивна.)

Скорее всего, ТС не включал свой .h файл даже туда, где он нужен. Я не вижу включения 'Child.h' нигде в посте 30. Поэтому его проект успешно компилировался (несмотря на определения функций в .h файле), а перегруженные версии операторов не вызывались.
0
alsav22
31.10.2014, 01:49
  #37

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Спрашивается: каким образом ТС умудрился это скомпилировать? И компилировал ли ТС это вообще?
Хороший вопрос.

0
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
31.10.2014, 02:21  [ТС] 38
вот он ответ, спасибо, а то что-то все вдруг запутались) и на 2 страницы ростянулась непонятница) не стану проверять, забыл на это и перегрузил просто методы

Добавлено через 26 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Спрашивается: каким образом ТС умудрился это скомпилировать? И компилировал ли ТС это вообще? (По 30-му посту, кстати, хорошо видна порочность всей затеи, о которой я говорил ранее. Строчка 'fstr << v' будет вызывать рекурсивно все тот же 'operator <<'. Т.е. эта реализация бесконечно рекурсивна.)
все компилировалось, просто сама перегрузка не вызивалась, как вы говорили не видило ее.
0
31.10.2014, 02:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2014, 02:21
Помогаю со студенческими работами здесь

Не могу в дочернем классе вызвать protected метод
Всем привет! Начал писать одну программку, и столкнулся со следующей проблемой: у меня пока 2...

Изменение информации в дочернем классе, через ссылку
Подскажите, есть класс class Class1 В конструкторе я создаю структуру, которая будет хранить...

Можно ли как-то в дочернем классе получить указатель родителя?
У меня тут появилась мыслишка :D В любом классе есть так сказать скрытый указатель на самого себя...

перегрузка fstream
Вот пробую перегрузить операторы ввода / вывода с файлами, но почему-то даже не компилирует....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru