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