У меня есть следующий код в заголовочном файле
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(){
}
};
Одна проблема заключается в том, что для правильного распределения памяти класс реализации не может добавлять дополнительные переменные (открытые или закрытые).
Ты можешь использовать Pimpl идиома
Пример:
// Pimpl idiom - basic idea
class widget {
// :::
private:
struct impl; // things to be hidden go here
impl* pimpl_; // opaque pointer to forward-declared class
};
Других решений пока нет …