Лучший способ скрыть частных участников в классе

У меня есть следующий код в заголовочном файле

class Bar {
   public: 
      void public_foo();
   private:  
      void private_foo();
};

Реализация скрыта в исходном файле

void Bar::public_foo(){
   private_foo();
}
void Bar::private_foo(){
   // Some more stuff
}

Я хотел бы, чтобы закрытая функция не отображалась в заголовочном файле. Каков наилучший способ сделать это? Я знаю два пути:

1) сделать private_foo функция, не являющаяся членом, как это

void private_foo(Bar* this){ /* ... */ }

И позвони в public_foo как это: private_foo(this), Это не очень привлекательно для меня, потому что это не особенно ОО программирование.

2) Используйте скрытый класс реализации, как это

// In header
class Bar {
   public: 
      virtual void public_foo();
      virtual ~Bar() { };
};
Bar* CreateBar();

// In Source
class Bar_impl : public Bar {
   public:
      void public_foo();
   private:  
      void private_foo();
};

Bar* CreateBar(){
    return new Bar_impl;
}

void Bar::public_foo(){
   private_foo();
}
void Bar::private_foo(){
    // Some more stuff
}

Это работает, но это слишком много для чего-то такого простого.

Есть ли третий (лучший) метод?

РЕДАКТИРОВАТЬ: В ответ на @jdehesa, и потому что я люблю носить шляпу дизайнера языка, вот мой идеальный синтаксис (НЕ правильный синтаксис C++, но можно мечтать)

// In header
class Bar {
   public: 
      void public_foo();
};

// In Source
classdef Bar {   // Notice my new "classdef" keyword
public: 
   void public_foo(){
   }

private:
   void private_foo(){
   }
};

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

1 ответ

Вы можете использовать PIMPL идиома

Пример:

// Pimpl idiom - basic idea
class widget {
    // :::
private:
    struct impl;        // things to be hidden go here
    impl* pimpl_;       // opaque pointer to forward-declared class
};
Другие вопросы по тегам