隐藏私人成员的最佳方法

时间:2018-03-26 12:56:59

标签: c++ paradigms

我在头文件中有以下代码

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)。 这对我来说不是很吸引人,因为它不是特别的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
}

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

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

编辑:回应@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 个答案:

答案 0 :(得分: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
};
相关问题