Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
1

Как правильно унаследовать ostream, istream ?

28.05.2017, 17:55. Показов 1766. Ответов 6
Метки нет (Все метки)

Ну вообщем цель такова, чтобы в функцию можно было передать либо обьект моего класса, либо же cout , cin.
C++
1
2
3
4
5
MyStream mout = MyStream();
MyStream min = MyStream();
 
static int UShowTFileList(ostream& out = mout);
static int ShowTFileList(ostream& out = cout);
Для этого наследую ostream,istream.
C++
1
2
3
class MyStream : public ostream, public istream {
...
}
Но обьекты MyStream создать не могу:
C++
1
2
3
4
5
MyStream mout = MyStream();
MyStream min = MyStream();
 
-->
Error (active)  E1790   the default constructor of "MyStream" cannot be referenced -- it is a deleted function
Пытался наследовать от более базовых классов, но у них тоже нет конструкторов... Как правильно ?
Ну и все обычные вызовы mout, min теперь с ошибкой.
C++
1
2
3
4
mout << "Hello, world!" << "\n";
 
->
Error   C2280   'MyStream::MyStream(const MyStream &)': attempting to reference a deleted function
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2017, 17:55
Ответы с готовыми решениями:

Ostream istream
Народ объясните пожалуйста на пальцах что это и для чего это нужно friend ostream&amp; operator&lt;&lt;...

istream, ostream
Есть задача по сохранению в файл и восстановлении из файла объекта. Функции надо сделать такие:...

Перегрузка дружественных операторов istream ostream
Проблема следующая. Выдает ошибку 1&gt;Source.obj : error LNK2019: ссылка на неразрешенный внешний...

Пример с книги, ругается на istream и ostream
Создание класса массива с перезагрузкой операций, ругается на istream и ostream. Переписал все с...

6
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
28.05.2017, 19:18 2
Почему сразу от двух? И зачем вообще наследование?
0
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
28.05.2017, 19:32  [ТС] 3
nmcf, ну в примере выше только один, а вообще функции надо передать два параметра.
C++
1
2
static int UShowTFileList(ostream& out, istream& in);
static int ShowTFileList(ostream& out, istream& in);
Цитата Сообщение от nmcf Посмотреть сообщение
И зачем вообще наследование?
Мои познания в плюсах говорят, что с помощью наследования можно достигнуть желанного
Но это конечно не точно.
Можно поставить вопрос так: как сделать так, чтобы мои mout, min могли заменить стандартные cout, cin ?
Чтобы функция могла писать в тот поток, который ей передали.

Кликните здесь для просмотра всего текста

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#pragma once
 
#include <Windows.h>
#include <iostream>
 
 
using namespace std;
 
class MyStream : public ostream, public istream {
 
private:
    BOOL carry_flag = TRUE;
 
public:
    BOOL indent_flag = FALSE;
 
    template <typename T>
    MyStream& operator<< (T &&out)
    {
        if (indent_flag) {
 
            if (strncmp(typeid(out).name(), "char const", 10) == 0) {
                if ((const char *) out == "\n") {
                    cout << "\n";
                    carry_flag = TRUE;
                    return *this;
                }
                if ((const char *) out == "\n\n") {
                    cout << "\n" << "   |   " << "\n";
                    carry_flag = TRUE;
                    return *this;
                }
            }
 
            if (carry_flag) {
                cout << "   |   " << forward<T>(out);
                carry_flag = FALSE;
            }
            else cout << forward<T>(out);
 
        }
        else {
 
            cout << forward<T>(out);
 
        }
 
        return *this;
 
    }
 
    template <typename T>
    MyStream& operator>> (T &&out)
    {
        if (indent_flag) {
 
            cin >> forward<T>(out);
 
            cout << "   |   ";
 
        }
        else {
 
            cin >> forward<T>(out);
 
        }
 
        return *this;
 
    }
 
};
 
MyStream mout = MyStream();
MyStream min = MyStream();
0
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
28.05.2017, 22:48 4
Ну тебе надо определить конструктор как в istream, по-видимому.
0
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
29.05.2017, 14:47  [ТС] 5
nmcf, я конечно попытался поперется в заголовочный файл <istream.h>. но без опыта в плюсах туда смотреть просто страшно.

Добавлено через 15 часов 35 минут
в целом, шатаясь по просторам интернета, выяснил что необходимо еще класс streambuffer определить. но для обретки над iostream, а не для полноценного потока вывода, как по мне можно использовать
C++
1
2
iostream sb;
sb.rdbuf(); // вернуть буфер
Но как использовать не знаю. Хотя данный пример работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class DebugMessage : public std::ostream
{
public:
    DebugMessage() : std::ostream(std::cout.rdbuf()) { }
    virtual ~DebugMessage() { *this << std::endl; }
};
 
int main(int argc, char *argv[])
{
    DebugMessage() << "hello" << 42;
 
    system("pause");
    return 0;
}
А этот уже нет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class DebugMessage : public std::iostream
{
public:
    std::iostream ios;
    DebugMessage() : std::iostream(ios.rdbuf()) { }
    virtual ~DebugMessage() { *this << std::endl; }
};
 
int main(int argc, char *argv[])
{
    DebugMessage() << "hello" << 42;
 
    system("pause");
    return 0;
}
0
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
29.05.2017, 16:46 6
Лучший ответ Сообщение было отмечено Evgen8 как решение

Решение

iostream подразумевает, что буфер чтения и записи общий, а для cin/cout это не так. Поэтому их не соединить.
И я всё равно не пойму, что ты хочешь получить? Даже если наследовать от istream, то придётся, по-видимому, переписывать взаимодействие с streambuf, чтобы вклинить что-то во ввод.
1
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
29.05.2017, 17:14  [ТС] 7
nmcf, действительно, это того не стоит. Слишком сложно для новика в плюсах.
C++
1
2
3
4
5
6
7
8
9
10
template<typename Ostream, typename Istream>
    static int ShowTFileListT(Ostream& out, Istream& in);
 
int Process::ShowTFileList() {
    return ShowTFileListT<ostream, istream>(cout, cin);
}
 
int Process::IShowTFileList() {
    return ShowTFileListT<MyStream, MyStream>(mout, min);
}
Цитата Сообщение от nmcf Посмотреть сообщение
И я всё равно не пойму, что ты хочешь получить?
мне необходимо чтобы в функцию можно было передать в какой поток ей писать.
в мой собственный или в стандартный. и не флагом BOOL. и именно поток.
но привести мой "поток" , который по сути маленькая оболочка над стандартным, к типу потока не удалось из-за сложности наследования.
что ж, тогда все функции приведем к шаблонам.

Добавлено через 2 минуты
MyStream.h
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2017, 17:14

Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП
Два пользовательских класса: Точка в 2D пространстве и точка в 3D пространстве. class TPoint3D{...

Наследование классов С++ (не могу правильно унаследовать базовый класс)
Здравствуйте, вот хочу разобраться как правильно унаследовать класс. Задача такова, унаследовать...

Как правильно унаследовать класс?
Есть класс для работы с большими целыми знаковыми числами. public class BigNum { static...

Разница между istream::putback и istream::unget
Можете объяснить, пожалуйста, разницу этих двух функций?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.