工厂函数作为类或命名空间中的静态成员
Factory function as static member in class or in namespace?
工厂函数应该作为静态成员在自己的类中还是在命名空间中?在创建类工厂时,我必须使用一个意思,这两个意思之间有什么区别吗?
在我的例子中,工厂生产的类是容器对象,它们有不同的内存结构作为支持。类似的东西
template< typename T >
class Parent
{
virtual void myFunction() = 0;
// more virtual interface functions...
}
template< typename T >
class ChildA : public Parent< T >
{
virtual void myFunction() override;
}
template< typename T >
class ChildB : public Parent< T >
{
virtual void myFunction() override;
}
template< typename T >
Parent< T >* factory( PerformanceTraits traits );
我研究了类上的Namespace+函数与静态方法,还阅读了Scott Meyers关于这个主题的看法,但我似乎无法将其应用于工厂函数。
如果我使用名称空间,我可以编写
Parent* obj = MyFactoryNamespace::factory< int >( traits );
与相比
Parent* obj = MyFactoryClass< int >::factory( traits );
如果我使用模板化的工厂类。除了这是两种写同一件事的方法之外,还有技术上的区别吗?
谢谢。
这取决于情况。没有真正的答案。在很多情况下用户可见的唯一类是抽象基类;这个声明并定义了工厂正在构建的实际类在源文件的未命名命名空间中。在这种情况下,显然工厂函数将在一个名称空间中,在标头中声明。如果在您的应用程序,那么保持一致是有意义的,并声明命名空间范围内的所有工厂函数。否则这更多的是一个风格问题。做你觉得最好的事。(但要保持一致。)
无论哪种方式,您都只需要获得一个名称愚蠢的全局。但大多数代码的读者都希望它是它创建的东西的静态成员,即Parent。这对我来说是一种熟悉的模式,但使用其他名称空间似乎无关紧要,也很奇怪。
相关文章:
- Typedef 不是命名空间的成员
- 将typeID转换为静态成员访问(C )的命名空间
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- "uintmax_t":不是"全局命名空间"的成员
- 从另一个命名空间访问标准命名空间数据成员
- 我们不能在未赋值的上下文中命名非静态成员函数是有原因的吗
- C++命名空间错误:不是命名空间的成员
- InitializeCriticalSectionEx 不是 atlwinverapi.h 中全局命名空间的成员
- 在vs2010中使用iostream时,出现错误C2039:'exit':不是"全局命名空间"的成员
- 函数不是全局命名空间的成员
- 不是全局命名空间的成员
- 一个命名空间是否可以是另一个命名空间的成员
- "CreateEvent":不是 ASIO 中"全局命名空间"的成员
- 当外部命名空间具有具有相同名称的成员时,访问未命名命名空间的成员
- Template函数不是命名空间的成员
- c++中的命名空间私有成员
- 命名空间“静态”是否仍在 C++11 中弃用
- 编译错误错误 C2039:"clock_t":不是"全局命名空间"的成员
- 如何在用户定义的命名空间的成员函数中引用指针 **environ?
- C2039:类不是命名空间的成员