Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时使用静态类函数而不是命名空间函数? 我目前正在尝试实现工厂设计模式,并且对于如何在C++中进行这一点有些困惑。我一直在指网页_C++_Namespaces_Factory_Static Methods - Fatal编程技术网

何时使用静态类函数而不是命名空间函数? 我目前正在尝试实现工厂设计模式,并且对于如何在C++中进行这一点有些困惑。我一直在指网页

何时使用静态类函数而不是命名空间函数? 我目前正在尝试实现工厂设计模式,并且对于如何在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

因此,在该网页上,他们展示了一个示例,其中他们定义了一个名为ComputerFactory的工厂类。这个类有一个新的静态计算机方法

 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();
换句话说,如果您使用的是名称空间,并且在任何情况下都不是最佳解决方案,则只能定义函数模板。
此外,您不能像创建类那样创建别名,因此必须明确任何调用位置的类型,并且它可能容易出错,并且很难重构