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

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

Восстановить пароль Регистрация
 
senich
61 / 61 / 23
Регистрация: 22.11.2012
Сообщений: 236
Записей в блоге: 1
03.07.2015, 16:25     Потоки и сокрытие данных #1
Всем доброго времени суток. Появился вопрос, касающийся потоков. Есть класс, в котором имеются функции для вывода внутренних данных в поток. Всё работает, но функция вывода является дружественной и возвращает поток вывода, чтобы обеспечить каскадные вызовы. Тогда, если я правильно понимаю, эта функция становится глобальной и доступной пользователю класса. Как обеспечить каскадные вызовы и сокрытие одновременно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
03.07.2015, 16:29     Потоки и сокрытие данных #2
Используйте гетеры.
senich
61 / 61 / 23
Регистрация: 22.11.2012
Сообщений: 236
Записей в блоге: 1
03.07.2015, 23:44  [ТС]     Потоки и сокрытие данных #3
В данном случае мне нужно не ограничить доступ пользователя к данным, а скрыть от него существование функции, которая, исходя из мой реализации, является глобальной.
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 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     Потоки и сокрытие данных
Ответ Создать тему
Опции темы

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