我想问一下有关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);
...
}
我知道声明友方功能可以解决问题。但是,它使类声明变得丑陋。另外,对于每个新的辅助函数,我都要添加一个友元函数。
这有成语/设计模式吗?我一直在网上搜索,但没找到。
提前谢谢你。非常感谢您的回答。
答案 0 :(得分:1)
设计模式很简单:don't use helper classes。如果一个班级应该做某事,那就让它自己做。
答案 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);
...
}
使用pimple idiom。使用此习惯用法时,您可以在私有数据类中添加任意数量的辅助函数,而无需触及该类的公共接口。
答案 2 :(得分:1)
根据我的经验,许多开发团队对静态本地帮助程序功能没有任何问题,它有助于减少标头膨胀,有助于保持正式暴露的界面更小等等。它具有重量轻的优点,它的缺点是如果你使用了很多私人成员而没有访问者,它会导致朋友臃肿/污染。
但在讨论界内,人们普遍赞成以下内容。
这样做的好处是可以清楚地将fn _doThingsForFoo(Foo*)
与Foo
相关联,从而避免让您免于暴露私人会员的许多麻烦。
它的缺点是基本上向所有需要#include你头部的人展示你的内衣。
你申报了第二堂课,"私人执行" (https://en.wikipedia.org/wiki/Opaque_pointer,Is the pImpl idiom really used in practice?)并将您在主标题中不想要的所有私密内容放入其中。
它的优点是允许你隐藏你的东西,它的缺点是添加额外的指针来提供,存储和遍历(哦和免费)。
答案 3 :(得分:0)
根据StenSoft给出的upvoted答案,你应该在类中实现方法。但是,如果由于某种原因这不是一个选项,那么使用帮助器。如果即使这不是一个选项,那么使用反射。如果即使这不是一个选项,那么在类中使用命令监听器。如果即使这不是一个选项,那么请观看教程。
答案 4 :(得分:0)
您可以为此目的阅读以下网站PIMPL,Opaque pointer。有了这个,你只需要有一个成员变量,你可以将所有私有东西放入私有类。
你的标题:
class PrivateClass;
class Class
{
public:
// ...
private:
PrivateClass* m_Private;
};
你的来源:
class PrivateClass
{
// ...
};
Class::Class
: m_Private( new PrivateClass )
{
// ...
}
更新:我忘了提及删除析构函数中的私有成员。
Class::~Class
{
delete m_Private;
// ...
}
// ...