c ++内部帮助器类

时间:2015-06-12 15:56:47

标签: c++ c++11

我想问一下有关C ++中内部帮助器类的问题。构建这个的最佳方法是什么?

让我通过示例澄清内部帮助程序类的含义。

// MyClass.h
class MyClass
{
    int myData;
    bool isSomething;
    ...
public:
    void DoSomething();
};

// MyClass.cpp
// This is what I mean by internal helper function. Helper function that's only visible int the implementation file (.cpp) but requires access to the private members of the class.
static void DoSomethingInternal( MyClass *myClass )
{
   // Access myClass private members
}

void MyClass::DoSomething()
{
    ...
    DoSomethingInternal(this);
    ...
}

我知道声明友方功能可以解决问题。但是,它使类声明变得丑陋。另外,对于每个新的辅助函数,我都要添加一个友元函数。

这有成语/设计模式吗?我一直在网上搜索,但没找到。

提前谢谢你。非常感谢您的回答。

5 个答案:

答案 0 :(得分:1)

设计模式很简单:don't use helper classes。如果一个班级应该做某事,那就让它自己做。

答案 1 :(得分:1)

有几种方法可以实现这一目标。

  1. 如果帮助程序函数不需要直接访问数据,请在.cpp文件中使用帮助程序类/函数。我会在下一个方法之前推荐这种方法。

    在.cpp文件中:

    // Create a namespace that is unique to the file
    namespace MyClassNS
    {
       namespace HelperAPI
       {
          void DoSomethingInternal(MyClass* obj) { ... }
       }
    }
    
    using namespace MyClassNS;
    void MyClass::DoSomething()
    {
        ...
        // 
        HelperAPI::DoSomethingInternal(this);
        ...
    }
    
  2. 使用pimple idiom。使用此习惯用法时,您可以在私有数据类中添加任意数量的辅助函数,而无需触及该类的公共接口。

答案 2 :(得分:1)

根据我的经验,许多开发团队对静态本地帮助程序功能没有任何问题,它有助于减少标头膨胀,有助于保持正式暴露的界面更小等等。它具有重量轻的优点,它的缺点是如果你使用了很多私人成员而没有访问者,它会导致朋友臃肿/污染。

但在讨论界内,人们普遍赞成以下内容。

  • 将帮助程序声明为私有成员函数。

这样做的好处是可以清楚地将fn _doThingsForFoo(Foo*)Foo相关联,从而避免让您免于暴露私人会员的许多麻烦。

它的缺点是基本上向所有需要#include你头部的人展示你的内衣。

  • 使用Pimpl习语。

你申报了第二堂课,"私人执行" (https://en.wikipedia.org/wiki/Opaque_pointerIs the pImpl idiom really used in practice?)并将您在主标题中不想要的所有私密内容放入其中。

它的优点是允许你隐藏你的东西,它的缺点是添加额外的指针来提供,存储和遍历(哦和免费)。

答案 3 :(得分:0)

根据StenSoft给出的upvoted答案,你应该在类中实现方法。但是,如果由于某种原因这不是一个选项,那么使用帮助器。如果即使这不是一个选项,那么使用反射。如果即使这不是一个选项,那么在类中使用命令监听器。如果即使这不是一个选项,那么请观看教程。

答案 4 :(得分:0)

您可以为此目的阅读以下网站PIMPLOpaque pointer。有了这个,你只需要有一个成员变量,你可以将所有私有东西放入私有类。

你的标题:

class PrivateClass;

class Class
{
public:
    // ...

private:
    PrivateClass* m_Private;
};

你的来源:

class PrivateClass
{
// ...
};

Class::Class
: m_Private( new PrivateClass )
{
// ...
}

更新:我忘了提及删除析构函数中的私有成员。

Class::~Class
{
    delete m_Private;
// ...
}

// ...