没有使用名字空间的情况下,产生了命名冲突如何解决?
如果在两个不同的头文件里(h1.h和h2.h)都定义了class A,没有使用名字空间,而且这两个头文件都不能改变,因为它们已经被很多人使用了~~
这时如果在同一个地方要用到这两个A,怎么办呢?
如下:
// 头文件h1.h
#ifndef _H1_H_
#define _H1_H_
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A1" << endl;
}
};
#endif
// 头文件h2.h (与h1.h基本一样,只是打印出来的是“A2”)
#ifndef _H2_H_
#define _H2_H_
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A2" << endl;
}
};
#endif
为方便表达,把上面两个A姑且称为A1和A2
// 若这样使用
#include "h1.h"
#include "h2.h"
int main()
{
A a1; // A1
A a2; // A2
return 0;
}
则编译会提示命名冲突。
为了避免在同一个cpp中include这两个头文件,我尝试了下把cpp拆成两个文件,这样倒是编译通过了,只是运行结果不对。如下:
// 头文件 main.h
#ifndef _MAIN_H_
#define _MAIN_H_
void f(); // 把用到A2的代码写到f()里,这样就不会名字冲突了
#endif
// main2.cpp
#include "main.h"
#include "h2.h"
void f()
{
A a; // 此处应该为A2
}
// main.cpp
#include "main.h"
#include "h1.h"
void main()
{
A a; // 这句正常打印出“A1”
f(); // 这句却也打印出了“A1”。如果把上面那句注释掉,则这句就能正常打印出“A2”。估计是链接的问题
system("pause");
}
请教各位前辈,有什么办法可以解决这个该死的名字冲突问题吗?
[解决办法]
h1w.h
namespace h1w{#include "h1.h"}
[解决办法]
用pimpl把这两个类封装一下再用。
// aone.hclass A;class AONE{public: AONE(void); ~AONE(void); int func(int x);private: A *imp_;};// aone.cpp#include "h1.h"AONE::AONE(void): imp_(new A){}AONE::~AONE(void){ delete imp_;}int AONE::func(int x){ return imp_->func(x);}
[解决办法]
一楼的方法就是脱裤子放屁,将h1.cpp和h2.cpp从项目中移出还不如直接修改h1.cpp和h2.cpp.在真正的项目开发中如果用这种方法处理命名冲突直接就拖出去枪毙.
[解决办法]
建议改代码 不改代码可以用这种麻烦的方法
1 定义一个接口
class IA
{
virtuarl fun() = 0;
}
2 定义CA1继承并重载第一个A类的函数
class CA1:public IA, A
{
virtual fun() {A::fun();}
}
将这个类编译到一个动态链接库,链接库提供导出函数
IA* getA() { return new CA1(); }
3 定义CA2继承并重载第二个A类的函数,操作方法与2类似
4 在需要同时用到A1和A2的地方用IA接口代替