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


Автор: Андрюша- BIGAIR 27.12.2005, 19:51
Всем привет! Помогите пожайлуста от етого решается моя еценка на екзаме! Вопщм препод спросил : " Сказать концепцию, как можна сделать закрытую часть класа невидимой!" . Заранье очень благодареен! smile

Автор: Nitro89 27.12.2005, 19:55
Парень конкретизируй вопрос. Непонятно, невидимой для кого.
Вот например можно сделать так.
Код

class A { //вспомогательный класс
protected:
//закрытая часть класса
};
class B: public A {  //нужный нам класс
//часть класса A закрыта, но в определении ее не видно,
//такая нужна невидимость?
};

А?

Автор: JoyEx 27.12.2005, 20:05
Андрюша, а на каком Вы курсе?

private: может помочь.

Автор: maxim1000 27.12.2005, 20:55
может, подразумевалось то, чтопрограммист, подключающий h-файл, в котором описан класс, не должен видеть его закрытых членов?
если так, то может подойти такой вариант: все закрытые члены вытаскиваем в структуру, а в самом классе делаем указатель на нее, в конструкторе создаем, в деструкторе удаляем...
Добавлено @ 20:59
пример:
было
Код

class A
{
  public:
    ...
  private:
    int x;
    double y;
};

стало
Код

struct PrivateMembers;
class A
{
  public:
    ...
  private:
    PrivateMembers *Private;
};

а где-то в cpp
Код

struct PrivateMembers
{
  int x;
  double y;
};

Автор: Андрюша- BIGAIR 28.12.2005, 00:58
smile Кстати так оно звучит! - программист, подключающий h-файл, в котором описан класс, не должен видеть его закрытых членов! maxim1000 Спасибо! Может и оно! smile Неуверен! Но вопрос звучит имено так!

Автор: Андрюша- BIGAIR 28.12.2005, 01:01
Можнно чуток подробней! Для меня молодого, "конструкторе создаем, в деструкторе удаляем... " - этот момент! Спасибо!

Автор: Chaos A.D. 28.12.2005, 07:55
Скажи преподу - "С помощью идиомы pimpl". Это и есть то, что показал maxim1000. В кач-ве примера можно привести такой код:

Код


/* foo.h */
class Foo
{
        struct FooImpl;
        FooImpl *pimpl_;  // за этим так называемым "брандмауэром компиляции"
                          // и скрывается весь закрытый интерфейс.

    public :
        Foo( void );
        ~Foo( void );
        
        void Fn( void );
};

/* foo.cpp */

#include "foo.h"

struct FooImpl
{
    void PrivateFn( void ) { /*...*/ }
    // Все закрытые функции выноси сюда.
};

Foo::Foo( void ) : pimpl_(new FooImpl) {}    // Это и есть "конструкторе создаем".
Foo::~Foo( void ) { delete pimpl_; }    // А это соответственно "деструкторе удаляем"

void Foo::Fn( void )
{
    DoSomething();
    pimpl_->PrivateFn();
}


Удачи на экзамене.

Автор: Neitron 28.12.2005, 16:45
Чушь это все.....
Человеку скорее всего нужна простая схема создания интерфейсов...
делается она так

Код

class Interface
{
 int a;
int b;
virtual void f()=0;
};

class Code : public Interface
{
void f();
void b();
};

//где-то в коде....

Interface * I = new Code();

/*Теперь I знает только о методах класса interface но,
 в его реализации и работе присутствует методы класса Code;*/

Автор: Андрюша- BIGAIR 28.12.2005, 23:21
Спасибо большое!

Автор: DeadSoul 28.12.2005, 23:25
Цитата(Neitron @ 28.12.2005, 16:45)
Чушь это все.....

Судя по вопросу речь идет о PIMPL. И это не чушь. Это кардинально уменьшает время компиляции при изименение private-части класса.

Автор: profispb 28.12.2005, 23:51
Извините за тупой вопрос а что такое PIMPL? smile

Автор: DeadSoul 29.12.2005, 00:27
Цитата(profispb @ 28.12.2005, 23:51)
Извините за тупой вопрос а что такое PIMPL?

То что описал maxim1000. Pimpl расшифровывается как Pointer to implementation.


Автор: profispb 29.12.2005, 08:57
Спасибо за ответ DeadSoul. Теперь буду знать. smile

Автор: Guest 3.1.2006, 14:36
Эх Яременко,Яременко ты бы еще Бублику на ftpэто вылажил. Тебе ---5 балов. Ну нельзя же так! И тебе не стыдно а? С новым годом! smile

Автор: ГЛАМУР 4.1.2006, 16:17
А кокой смысл , етого так званого pimpl, в переводе читается как "указатель на реализацию"... Не могу понять что она делает! Мы невидим преременных закрытой части класа ? невидим всмысле - неможем использовать в программе или невидим исходный кодsmile! просто мне это , на моем уровне программирования, тяжело понять! Зарание спасибо за уточнение!

Автор: blackofe 4.1.2006, 18:36
Цитата(ГЛАМУР @ 4.1.2006, 16:17)
невидим всмысле - неможем использовать в программе или невидим исходный кодsmile!

так вот в том-то и вопрос: какая тебе невидимость нужна? вишь, народ мучается догадками. разъясни, чего именно ты хочешь.

Автор: завтра екзам:) 4.1.2006, 19:31
А сама идиома, она делает невидимым что? Кокая разница в процесе выполнения программы , чего мы достигаем?

между
Код

class A
{
  public:
    ...
  private:
    int x;
    double y;
};


и
код С++
Код

struct PrivateMembers;
class A
{
  public:
    ...
  private:
    PrivateMembers *Private;
};


гдето в С++
Код

struct PrivateMembers
{
  int x;
  double y;
};



Автор: DeadSoul 4.1.2006, 22:33
завтра екзамsmile, большая разница. При использование PIMPL мы не сможем легальнополучить доступ к закрытой части класса

Автор: до екзама 11 часов 4.1.2006, 23:25
А можно пожайлусто примерчик с ихдодничком:
как бы мы получали доступ без пимпл
и как бы мы его не получали с пимпл.



Доступ к чему? smile К переменным, или к исходному тексту? smile
можно маленький примерчикsmile

Автор: :( 4.1.2006, 23:29
Часть кода, приведенного раньше:

Код

Foo::Foo( void ) : pimpl_(new FooImpl) {}    // Это и есть "конструкторе создаем".
Foo::~Foo( void ) { delete pimpl_; }    // А это соответственно "деструкторе удаляем"

void Foo::Fn( void )
{
    DoSomething();
    pimpl_->PrivateFn();
}


pimpl_->PrivateFn(); - мы работаем с указателем после того как его уже удалили в деструкторе?!

Или как? smile smile

Автор: Daevaorn 4.1.2006, 23:55
smile+ 4.1.2006, 23:29, post606456-->
Цитата(smile @ 4.1.2006, 23:29 Найти цитируемый пост)

pimpl_->PrivateFn(); - мы работаем с указателем после того как его уже удалили в деструкторе?! 


Интересно откуда ты сделал такой вывод? smile

Автор: Guest 5.1.2006, 00:02
Да ладно неважно! Можеш мне просто обяснить, что именно ета идеома делает невидимым! Принцип зачем она нужна?

А нащет вывода: так это часть исходного кода, посмотри по этой теме чуток выше!

Автор: Daevaorn 5.1.2006, 00:10
Эта идиома позволяет скрыть детали реализации класса. Так же она способствует уменьшению зависимостей времени компиляции, что благоприятно сказывается на скорости сборки.
Принцип в том, что всё внутренне устройство класса скрыто и может быть написано в *.cpp файле. При этом для клиента класса остается только открытый интерфейс. Если потребуется изменение внутренней реализации класса, то всё делается опять таки в одном *.cpp файле. Это позволяет не перекомпилировать весь клиентский код, который использует данный класс. Конечно при изменении открытого интерфейса приемущества мы не получаем.

Автор: Guest 5.1.2006, 01:20
Спасибо! Большое!

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