Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > private-часть в декларации класса


Автор: EvilsInterrupt 18.1.2009, 15:27
Всем известно, что h/hpp это интерфейсные файлы, содержащие ровно столько, сколько должен знать о ней пользователь библиотеки для ее использования.

Вроде не приложная истина,  однако при написании класса, я не могу разделить декларацию класса ! Т.е. public в инклуде, а protected и private в реализации, т.е. в cpp-файле.

Раз нельзя, значит приходится с этим мириться или искать другие способы преодоления этого ограничения, чем я и занялся. Пояснив одному из знатоков у себя на работе услышал страшное слово "pimpl", как понял это необходимо создать класс дополнительный указать его в закрытых частях, а реализацию в конструкторе, т.е. new и в деструкторе delete и др. Но такая ситуция характерна для случаев только при кросс-платформенных проектов, когда хочется все сделать в едином стиле, а конкретику свести к некоторым классам. Мне кажется, пока не могу четко сформулировать почему, эта идиома не совсем подходит, но тогда

что вообще можно применить ?

Автор: Lycifer 18.1.2009, 16:42
Реализация класс это работа творческая, но посути ты имееш право открыть только паблик а то что не хочеш открывать делай реализацию  cpp(с) файле. ТО и есть делай через несколько классов.

P.S. Приватные поля это условное соображение , так как мы всегда можем получить память объекта. Ну а если все таки хочется закрыть, то тогда стоит делать какое ни будь связывание во время выполнения. 
Пример?

//закрытый класс, о котором не знает пользователь /.h
class A 
{
public:
void     PrintHelloWord();
};
//.h lkz gjkmpjdfntkz
class B
{
private:
 A* Get();
public:
      void PrintHelloWord();
};

//.cpp
void A::PrintHelloWord()
{
    std::cout<<"Hello Word"<<std::endl;
}
//.cpp
A* ptr = new A;
A* B::Get()
{
   return ptr;
}
void B::PrintHelloWord()
{
ptr->PrintHelloWord();
}


Это не идеальный код(напротив дажет, просто не хотелось заморачиваться), но зато думаю понятна суть!



Автор: mes 18.1.2009, 17:37
Цитата(EvilsInterrupt @  18.1.2009,  14:27 Найти цитируемый пост)
Всем известно, что h/hpp это интерфейсные файлы, содержащие ровно столько, сколько должен знать о ней пользователь библиотеки для ее использования.

Вроде не приложная истина,  однако при написании класса, я не могу разделить декларацию класса ! Т.е. public в инклуде, а protected и private в реализации, т.е. в cpp-файле.


секции нужны не для (визуального) сокрытия кода, а для контроля (компилятором)  доступа. 

Цитата(EvilsInterrupt @  18.1.2009,  14:27 Найти цитируемый пост)
Но такая ситуция характерна для случаев только при кросс-платформенных проектов, когда хочется все сделать в едином стиле, а конкретику свести к некоторым классам

нет, просто на примере крос. проектов хорошо демонстрируются преимущества.

Цитата(EvilsInterrupt @  18.1.2009,  14:27 Найти цитируемый пост)

что вообще можно применить ? 

и эту идеому (см паттерн bridge, частным случаем которй является pimpl) тоже, если для Вашего проекта она не является избыточной. Можно просто выделить абстрактные классы.
А может вобще ничего это не нужно - все зависит от проекта.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)