何时使用静态类函数而不是命名空间函数? 我目前正在尝试实现工厂设计模式,并且对于如何在C++中进行这一点有些困惑。我一直在指网页
因此,在该网页上,他们展示了一个示例,其中他们定义了一个名为ComputerFactory的工厂类。这个类有一个新的静态计算机方法何时使用静态类函数而不是命名空间函数? 我目前正在尝试实现工厂设计模式,并且对于如何在C++中进行这一点有些困惑。我一直在指网页,c++,namespaces,factory,static-methods,C++,Namespaces,Factory,Static Methods,因此,在该网页上,他们展示了一个示例,其中他们定义了一个名为ComputerFactory的工厂类。这个类有一个新的静态计算机方法 class ComputerFactory { public: static Computer *NewComputer(const std::string &description) { if(description == "laptop") return new L
class ComputerFactory
{
public:
static Computer *NewComputer(const std::string &description)
{
if(description == "laptop")
return new Laptop;
if(description == "desktop")
return new Desktop;
return NULL;
}
};
NewComputer是静态的这一事实意味着它与ComputerFactory的单个实例没有关联。因此,可以通过编写代码从代码中调用此方法
ComputerFactor::NewComputer("description");
现在我很好奇为什么需要将它包装在一个类中。因为它是静态的,实际上并不意味着与任何类相关联,所以执行以下操作更有意义
namespace ComputerFactory
{
static Computer *NewComputer(const std::string &description)
{
if(description == "laptop")
return new Laptop;
if(description == "desktop")
return new Desktop;
return NULL;
}
}
所以我的问题是:
- 我描述的名称空间函数是有效的替代方案吗
- 定义一个只有静态方法的类有意义吗?使用名称空间似乎更有意义
名称空间中就更有意义了
如果方法是特定于类的,那么将它们设置为类本身内部的static
,这将导致更好的封装
我描述的名称空间函数是有效的替代方案吗
对
定义一个只有静态方法的类有意义吗?使用名称空间似乎更有意义
对于一个类,您可以做一些您不能用名称空间做的事情。
您提到了其中的一个(使用私有成员,即使您可以使用匿名名称空间来做类似的事情——实际上不是很好)
另一个相关的例子是,您无法模板化名称空间,这可能非常烦人。
例如,这发生在一个类中:
template<typename T>
struct S {
static T f() { return T(); }
// Other member functions
};
// ...
using MyS = S<int>;
MyS::f();
模板
结构{
静态tf(){返回T();}
//其他成员职能
};
// ...
使用MyS=S;
MyS::f();
这在模板中发生:
namespace N {
template<typename T>
T f() { return T(); }
// Other function template
}
// ...
N::f<int>();
名称空间N{
模板
tf(){返回T();}
//其他功能模板
}
// ...
N::f();
换句话说,如果您使用的是名称空间,并且在任何情况下都不是最佳解决方案,则只能定义函数模板。
此外,您不能像创建类那样创建别名,因此必须明确任何调用位置的类型,并且它可能容易出错,并且很难重构