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

Можно ли прятать методы класса в пространство имен? - C++

Восстановить пароль Регистрация
 
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
03.01.2014, 23:29     Можно ли прятать методы класса в пространство имен? #1
Здравствуйте!

Понимаю, что вопрос немного странноват и туповат, но все же... Можно ли убрать некоторые (или все) методы класса в пространство имен? Чтобы вызывать метод вот так:
C++
1
myClass.myNamespace::myMethod(myArgs);
Просто есть класс, который разрабатывался исключительно как класс-родитель, этакий драйвер. Было бы здорово заныкать его методы, чтобы они светились только на низком уровне... Конечно, можно просто добавить простой префикс, но с пространством имен все же покрасивее будет.

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2014, 23:29     Можно ли прятать методы класса в пространство имен?
Посмотрите здесь:

C++ Пространство имен
C++ пространство имен
пространство имен для шаблонного класса C++
пространство имен C++
Включение класса в пространство имен C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
03.01.2014, 23:38     Можно ли прятать методы класса в пространство имен? #2
Здесь можно использовать Pimpl, если я правильно понял идею.
Методы прячутся в класс реализации, а в классе интерфейса останется
лишь указатель на него (opaque pointer).

Например:

http://habrahabr.ru/post/111602/
Идиомы Pimpl и Fast Pimpl – указатель на реализацию
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
04.01.2014, 13:16  [ТС]     Можно ли прятать методы класса в пространство имен? #3
Спасибо за наводку, интересная штуковина. Попробую, но боюсь, на AVR-платформе не прокатит, там нет new и delete (стандартных).

Если что, сделаю объект-драйвер внутри класса устройства
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.01.2014, 13:17     Можно ли прятать методы класса в пространство имен? #4
Цитата Сообщение от Sky-WaLkeR Посмотреть сообщение
Здравствуйте!
Понимаю, что вопрос немного странноват и туповат, но все же... Можно ли убрать некоторые (или все) методы класса в пространство имен? Чтобы вызывать метод вот так:
Код C++
1
myClass.myNamespace::myMethod(myArgs);
Просто есть класс, который разрабатывался исключительно как класс-родитель, этакий драйвер. Было бы здорово заныкать его методы, чтобы они светились только на низком уровне... Конечно, можно просто добавить простой префикс, но с пространством имен все же покрасивее будет.
Это делается приватом.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.01.2014, 13:39     Можно ли прятать методы класса в пространство имен? #5
Sky-WaLkeR, можно сделать вложенную структуру примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
struct my_class {
 
   struct impl_t {
   
      // ...
   };
 
   impl_t impl;
 
   // ...
};
Тогда к "заныканым" методам надо будет обращаться через impl (myClass.impl.myMethod()).
Либо просто убрать в private, тогда они будут не доступны.
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
04.01.2014, 14:02  [ТС]     Можно ли прятать методы класса в пространство имен? #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Это делается приватом.
Вы не совсем поняли суть того, что я спросил. Не скрыть реализацию, я спрятать в отдельное пространство, чтобы при написании реализации драйвера программист писал что-то типа driver.Module::method(); , и этого метода не было видно в автозаполнении IDE, пока не напишешь Module::. При этом у программиста должна остаться возможность использовать в классе-наследнике функции класса-драйвера, например: device.Module::method(); (private не подойдет). То есть единственная цель всего этого - красивое отделение методов драйвера от методов класса-наследника, ну и кроссплатформенность драйвера (software-версия, hardware-версия, смешанная версия)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.01.2014, 14:05     Можно ли прятать методы класса в пространство имен? #7
Цитата Сообщение от Sky-WaLkeR Посмотреть сообщение
Вы не совсем поняли суть того, что я спросил. Не скрыть реализацию, я спрятать в отдельное пространство, чтобы при написании реализации драйвера программист писал что-то типа driver.Module::method();
А где хоть слово о реализации? Речь как раз об интерфейсе, методы вообще не будут ни где светиться.

Добавлено через 26 секунд
Не текст методов, а прототипы.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.01.2014, 14:11     Можно ли прятать методы класса в пространство имен? #8
Цитата Сообщение от gray_fox Посмотреть сообщение
можно сделать вложенную структуру
Ну т.е. сама структура\класс не обязательно вложенная, просто её экземпляр является членом my_class.
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
04.01.2014, 14:20  [ТС]     Можно ли прятать методы класса в пространство имен? #9
Вот пример того, о чем я говорю:
Как сейчас:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Driver{
public:
    void release();
    void select();
    void write_byte(uint8_t data);
    uint8_t read_byte();
};
 
class Device : public Driver{
    void send_data(){
        select();
        write_byte(0xfe);
        release();
    }
};
 
int main(){
    Device myDevice;
    myDevice.send_data();
    myDevice.write_byte(0xef);
}

Как хочется:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
// те же классы
int main(){
    Device myDevice;
    myDevice.send_data();
    myDevice.Driver::write_byte(0xef);
}


Цитата Сообщение от gray_fox Посмотреть сообщение
Ну т.е. сама структура\класс не обязательно вложенная, просто её экземпляр является членом my_class.
Да-да, я понял Вашу мысль, спасибо. Скорее всего, так и сделаю.

taras atavin
Нужно, чтобы доступ до них был из любого места, поэтому private не подходит (ну или я не знаю чего-то...).
Грубо говоря, добавив префикс к методам драйвера, можно все и закончить, но это не очень красиво, и в автодополнении наследника куча говна от драйвера болтается...
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
04.01.2014, 14:51     Можно ли прятать методы класса в пространство имен? #10
Sky-WaLkeR, методы, которые надлежит скрыть, можно сделать
дружественными функциями класса, и поместить в отдельное пространство имен.
Тогда IDE и автокомплит при обращении к классу их не будут видеть.
Правда, тогда теряются некоторые возможности, например virtual.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.01.2014, 15:00     Можно ли прятать методы класса в пространство имен? #11
Цитата Сообщение от Sky-WaLkeR Посмотреть сообщение
Нужно, чтобы доступ до них был из любого места,
А тогда зачем их вообще прятать? Или у тебя агрегат? Тогда агрегированный объект должен быть членом агрегата.
Sky-WaLkeR
1 / 1 / 0
Регистрация: 15.06.2012
Сообщений: 59
04.01.2014, 15:14  [ТС]     Можно ли прятать методы класса в пространство имен? #12
Цитата Сообщение от Убежденный Посмотреть сообщение
Sky-WaLkeRможно сделать
дружественными функциями класса, и поместить в отдельное пространство имен
Можно поподробнее, с простым примером? Их просто не будет видно или они будут недоступны?
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
04.01.2014, 15:23     Можно ли прятать методы класса в пространство имен? #13
foo.h
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
#pragma once
 
 
 
class foo;
 
namespace foo_impl
{
 
 
 
void private_method(foo &Foo);
 
 
 
} // namespace foo_impl
 
 
 
class foo
{
public:
    explicit foo(int Value);
    ~foo();
 
private:
    foo(foo const &);
    foo &operator =(foo const &);
 
public:
    void public_method();
 
private:
    int const m_Value;
 
friend void foo_impl::private_method(foo &Foo);
};
foo.cpp
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
#include "foo.h"
#include <iostream>
 
 
 
foo::foo(int Value) :
    m_Value(Value)
{
}
 
 
 
foo::~foo()
{
}
 
 
 
void foo::public_method()
{
    std::cout << m_Value << std::endl;
}
 
 
 
void foo_impl::private_method(foo &Foo)
{
    std::cout << Foo.m_Value * 2 << std::endl;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "foo.h"
 
 
 
int main()
{
    foo Foo(123);
    
    Foo.public_method();
    foo_impl::private_method(Foo);
 
    return 0;
}
Вывод:
> 123
> 246
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 15:23     Можно ли прятать методы класса в пространство имен?
Еще ссылки по теме:

Пространство имен C++
C++ Пространство имен
Пространство имен C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.01.2014, 15:23     Можно ли прятать методы класса в пространство имен? #14
Цитата Сообщение от Sky-WaLkeR Посмотреть сообщение
Можно поподробнее, с простым примером?
В таком случае вызов будет в таком виде:
C++
1
device_driver::write_bytes(myDevice, 0xff);
Yandex
Объявления
04.01.2014, 15:23     Можно ли прятать методы класса в пространство имен?
Ответ Создать тему
Опции темы

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