隐藏私人成员的最佳方法

Toh*_*iko 1 c++ paradigms

我在头文件中有以下代码

class Bar {
   public: 
      void public_foo();
   private:  
      void private_foo();
};
Run Code Online (Sandbox Code Playgroud)

该实现隐藏在源文件中

void Bar::public_foo(){
   private_foo();
}
void Bar::private_foo(){
   // Some more stuff
}
Run Code Online (Sandbox Code Playgroud)

我想在头文件中看不到私有函数.做这个的最好方式是什么?我知道两种方式:

1)private_foo创建这样的非成员函数

void private_foo(Bar* this){ /* ... */ }
Run Code Online (Sandbox Code Playgroud)

public_foo像这样称呼:private_foo(this).这对我来说不是很吸引人,因为它不是特别的OO编程.

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
}
Run Code Online (Sandbox Code Playgroud)

这有效,但对于这么简单的事情来说有点太多了.

有第三种(更好的)方法吗?

编辑:回应@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(){
   }
};
Run Code Online (Sandbox Code Playgroud)

一个问题是,为了正确的内存分配,实现类不能添加额外的变量(公共或私有).

小智 6

您可以使用PIMPL惯用法

例:

// Pimpl idiom - basic idea
class widget {
    // :::
private:
    struct impl;        // things to be hidden go here
    impl* pimpl_;       // opaque pointer to forward-declared class
};
Run Code Online (Sandbox Code Playgroud)