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

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

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

Студворк — интернет-сервис помощи студентам
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.10.2014, 18:01
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Не по теме:

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

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

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

Добавлено через 2 минуты
вот и говорю перегружаю в потомке, потом создаю обьект потомка и вызиваю унаследованый метод вывода, но выводит без редактирования тоесть без перегрузки которую я описал в чилде который и вызвал(
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 22:27
Цитата Сообщение от Lynatik001 Посмотреть сообщение
самый первый пост типо неочем не говорит?
Ни о чём. Ещё раз:
Цитата Сообщение от alsav22 Посмотреть сообщение
Где потомки класса, с с перегруженными вариантами записи \ чтения данных?
Потомки StudentManipulation:
Цитата Сообщение от Lynatik001 Посмотреть сообщение
Для этого описать класс StudentManipulation как базовый, и реализовать один или несколько классов потомков с перегруженными вариантами записи \ чтения данных.
0
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 22:50  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Потомки StudentManipulation:
Я писал что я
C++
1
2
3
4
class Child:public StudentManipulation{
    friend fstream &operator<<( fstream&  , string & );
    friend fstream &operator>>( fstream& , string & );
};
тоже делал реакции некакой
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 22:55
Цитата Сообщение от Lynatik001 Посмотреть сообщение
Я писал
Вы много, что писали. Я смотрю на код в 18 посте.
Цитата Сообщение от Lynatik001 Посмотреть сообщение
тоже делал реакции некакой
Что, где, как делали? Реакции на что?
Пустой разговор. Ясновидящих нет, кода мало (и то такой, то уже другой), запутанных вопросов много. Прогноз неблагоприятный.
0
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 23:15  [ТС]
Цитата Сообщение от 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.10.2014, 23:30
Цитата Сообщение от Lynatik001 Посмотреть сообщение
вызиваю
Выложенный код не компилируется, а поэтому и нет возможности проверить работу. Прогноз неблагоприятный.
0
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
30.10.2014, 23:51  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Выложенный код не компилируется, а поэтому и нет возможности проверить работу. Прогноз неблагоприятный.
ну да класс студент же не кидал, дай скайп кину проект
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
31.10.2014, 00:51
Лучший ответ Сообщение было отмечено 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2014, 01:25
Всё правильно, но в 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Эксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
31.10.2014, 01:29
Цитата Сообщение от 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2014, 01:36
Цитата Сообщение от 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Эксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
31.10.2014, 01:44
Цитата Сообщение от alsav22 Посмотреть сообщение
Смотрим 30-й пост.
30-й пост - это уже интереснее! Однако, что-то я слабо верю.

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

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

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

Не по теме:

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

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

Добавлено через 26 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Спрашивается: каким образом ТС умудрился это скомпилировать? И компилировал ли ТС это вообще? (По 30-му посту, кстати, хорошо видна порочность всей затеи, о которой я говорил ранее. Строчка 'fstr << v' будет вызывать рекурсивно все тот же 'operator <<'. Т.е. эта реализация бесконечно рекурсивна.)
все компилировалось, просто сама перегрузка не вызивалась, как вы говорили не видило ее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2014, 02:21
Помогаю со студенческими работами здесь

Использование переменных базового класса в дочернем классе
Доброго времени суток. Подскажите пожалуйста как в классе SumbString работать с переменными(string s;int z ; ) класса factory ? Мне...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru