【问题标题】:Pros and cons of organizing variables and methods in namespaces在命名空间中组织变量和方法的优缺点
【发布时间】:2018-12-10 02:50:00
【问题描述】:

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

后来我意识到太乱,太丑,很难改变,所以我把通过参数的引用去掉,全局声明。

然后我意识到这些类中的大多数只有一个实例,并将所有方法和成员变量设为静态,并删除了每个类中的唯一实例。

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

// 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)
    {
    // ...

现在我想知道:像我这样使用命名空间有什么优点和缺点?

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

    假设你有两个命名空间:

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

    在主文件中:

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

    输出:

    Error: Call of overloaded print() is ambiguous.
    

    为了解决这个问题,我们使用范围解析运算符(::)。

    在主文件中:

    int main(){
       one::print();
       two::print();
    }
    

    输出:

    one
    two
    

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多