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

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

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
};
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]