Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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 - Fatal编程技术网

C++ 在名称空间中组织变量和方法的利弊

C++ 在名称空间中组织变量和方法的利弊,c++,namespaces,C++,Namespaces,我有一些变量和方法,需要从任何地方都可以轻松访问,同时保持它们的良好组织性。我曾经将它们保存在按“category”组织的类中,并将对这些类的引用传递给需要它们的函数/方法(通过参数) 然后我意识到这太混乱、难看,很难进行更改,所以我通过参数去掉了引用,并全局声明了它们 然后我意识到这些类中的大多数只有一个实例,并使所有的方法和成员变量都是静态的,并且删除了每个类仅有的实例 然后我在互联网上读到一些东西,意识到(是的,再次)使用名称空间而不是类会更好(我可以使用使用名称空间,这非常方便)。现在有

我有一些变量和方法,需要从任何地方都可以轻松访问,同时保持它们的良好组织性。我曾经将它们保存在按“category”组织的类中,并将对这些类的引用传递给需要它们的函数/方法(通过参数)

然后我意识到这太混乱、难看,很难进行更改,所以我通过参数去掉了引用,并全局声明了它们

然后我意识到这些类中的大多数只有一个实例,并使所有的方法和成员变量都是静态的,并且删除了每个类仅有的实例

然后我在互联网上读到一些东西,意识到(是的,再次)使用名称空间而不是类会更好(我可以使用
使用名称空间
,这非常方便)。现在有点像这样:

// header
namespace Graphics
{
    // some functions
    void Initialize(HWND hWnd);
    void CreateTextureRenderTarget(UINT Width, UINT Height, DXGI_FORMAT Format, ID3D11RenderTargetView** RenterTargetOutput, ID3D11ShaderResourceView** ShaderResourceOutput, bool GenerateMips = false);
    // ...
    extern CComPtr<IDXGIFactory> Factory;
    extern CComPtr<IDXGIAdapter> Adapter;
    extern CComPtr<IDXGIOutput> Output; // The output (display monitor)
    extern CComPtr<IDXGISwapChain> SwapChain;
    extern CComPtr<ID3D11Device> Device;
    extern CComPtr<ID3D11DeviceContext> ImmediateContext;
    // ...
}

// source
namespace Graphics
{
    CComPtr<IDXGIFactory> Factory;
    CComPtr<IDXGIAdapter> Adapter;
    CComPtr<IDXGIOutput> Output;
    CComPtr<IDXGISwapChain> SwapChain;
    CComPtr<ID3D11Device> Device;
    CComPtr<ID3D11DeviceContext> ImmediateContext;
    // ...

    void Initialize(HWND hWnd)
    {
    // ...
//头
名称空间图形
{
//一些功能
无效初始化(HWND HWND);
void createTexturenderTarget(UINT宽度、UINT高度、DXGI_格式、ID3D11RenderTargetView**RenterTargetOut、ID3D11ShaderResourceView**ShaderResourceOut、bool GenerateMips=false);
// ...
外部采购商工厂;
外部CComPtr适配器;
extern CComPtr Output;//输出(显示监视器)
外部指挥交换链;
外部计算机设备;
外部CComPtr即时文本;
// ...
}
//来源
名称空间图形
{
买方工厂;
CComPtr适配器;
计算机输出;
首席SwapChain;
CComPtr装置;
CComPtr即时文本;
// ...
无效初始化(HWND HWND)
{
// ...

现在我想知道:像我这样使用名称空间的利弊是什么?

假设您有两个名称空间:

namespace one {
print(){ cout<<"one"<<endl;
}
namespace two {
print(){ cout<<"two"<<endl;
}
输出:

Error: Call of overloaded print() is ambiguous.
one
two
为了解决这个问题,我们使用范围解析运算符(:)

在主文件中:

using namespace one;
using namespace two;

int main(){
   print(); // conflict arises because it doesn't know which print to call
}
int main(){
   one::print();
   two::print();
}
输出:

Error: Call of overloaded print() is ambiguous.
one
two

假设您有两个名称空间:

namespace one {
print(){ cout<<"one"<<endl;
}
namespace two {
print(){ cout<<"two"<<endl;
}
输出:

Error: Call of overloaded print() is ambiguous.
one
two
为了解决这个问题,我们使用范围解析运算符(:)

在主文件中:

using namespace one;
using namespace two;

int main(){
   print(); // conflict arises because it doesn't know which print to call
}
int main(){
   one::print();
   two::print();
}
输出:

Error: Call of overloaded print() is ambiguous.
one
two