Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
senich
61 / 61 / 23
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
#1

Потоки и сокрытие данных - C++

03.07.2015, 16:25. Просмотров 201. Ответов 3
Метки нет (Все метки)

Всем доброго времени суток. Появился вопрос, касающийся потоков. Есть класс, в котором имеются функции для вывода внутренних данных в поток. Всё работает, но функция вывода является дружественной и возвращает поток вывода, чтобы обеспечить каскадные вызовы. Тогда, если я правильно понимаю, эта функция становится глобальной и доступной пользователю класса. Как обеспечить каскадные вызовы и сокрытие одновременно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 16:25     Потоки и сокрытие данных
Посмотрите здесь:

C++ Для чего было придумано сокрытие данных в ООП?
Потоки с++ C++
Тема потоки данных C++
C++ Потоки. Ввод данных.
C++ Сокрытие методов при наследовании
C++ Инкапсуляция и сокрытие данных не одно и тоже?
C++ Файловые потоки данных
C++ Потоки данных
COM порт, потоки, и таймер. Считывание данных C++
Является ли консоль носителем данных, то есть файлом, если потоки выводят информацию именно в ней? C++
C++ Потоки
C++ Сокрытие имен

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,050
Записей в блоге: 5
Завершенные тесты: 1
03.07.2015, 16:29     Потоки и сокрытие данных #2
Используйте гетеры.
senich
61 / 61 / 23
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
03.07.2015, 23:44  [ТС]     Потоки и сокрытие данных #3
В данном случае мне нужно не ограничить доступ пользователя к данным, а скрыть от него существование функции, которая, исходя из мой реализации, является глобальной.
hoggy
6010 / 2450 / 437
Регистрация: 15.11.2014
Сообщений: 5,424
Завершенные тесты: 1
04.07.2015, 03:20     Потоки и сокрытие данных #4
Цитата Сообщение от senich Посмотреть сообщение
Как обеспечить каскадные вызовы и сокрытие одновременно?
никак.

Цитата Сообщение от senich Посмотреть сообщение
скрыть от него существование функции
тогда вы не сможете выводить в поток.

это:
C++
1
std::cout << obj;
синтаксический сахар вызова функции:
C++
1
operator<<(std::cout, obj);
скроете её, и это перестанет работать.

обходные пути здесь - это для настоящих ценителей:


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
#include <iostream>
 
class example
{
    // --- можно сделать приватным
    // ограничив доступ к функции только избранным
    template<class T>
    ::std::basic_ostream<T>& 
    operator>>( ::std::basic_ostream<T>& os)const
    { 
        return os << "object of example: "<< v; 
    }
 
    
public:
    int v = 10;
    
    // например: только изнутри самого себя
    void aboutMe()const 
    { 
        // каскад, хе-хе
        *this>> (*this>> std::cout << std::endl); 
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    example().aboutMe();
    
    // error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’
    //std::cout << example() <<std::endl;
}
ну или так:

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
#include <iostream>
 
class example
{
    struct wrapper
    {
        explicit wrapper(const example& e)
            : ref(e)
        {}
        
        const example& ref;
    };
    
    template<class T> friend
    ::std::basic_ostream<T>& 
    operator<<( ::std::basic_ostream<T>& os, const wrapper& w)
    { 
        return os << "object of example: "<< w.ref.v; 
    }
 
    
public:
    int v = 10;
    
    void aboutMe()const 
    { 
        wrapper w(*this);
        std::cout << w << std::endl<< w<< std::endl;  
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    example e;
    
    e.aboutMe();
    
    // error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’
    // std::cout << e <<std::endl;
    
    // error: ‘struct example::wrapper’ is private
    // example::wrapper w(e);
    // std::cout << w <<std::endl;
}
а вообще, вы хотите что-то странное.
Yandex
Объявления
04.07.2015, 03:20     Потоки и сокрытие данных
Ответ Создать тему
Опции темы

Текущее время: 17:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru