运行时解析c ++命名空间冲突

时间:2010-08-24 04:14:59

标签: c++

File1.h

// Declaration  
Class A  
{  
void Func();  
}  
//Along with some other stuff  

File1.cpp

//Definition  
A::Func()  
{  
} 

// Along with some other stuff 

File2.h

class A  
{  
 void Func();  
}  

File2.cpp

// Definition  
File2::A::Func()  
{  
}  

File3.cpp  
#include "File1.h"  
#include "File2.h"  
//   
Invokes Func()  

Main1.cpp Main2.cpp

Main1.cpp File3.cpp和File2.cpp是一起构建的 Main1.cpp File3.cpp和File1.cpp是一起构建的 我想根据不同的链接调用Func() 但是,它给了我编译时错误 我该如何解决编译时错误?
是否有解决上述问题的标准方法?

如果我使用File1和File2的命名空间,那么我将无法 动态调用。注意:我无法更改File1.h

1 个答案:

答案 0 :(得分:0)

与Java(例如)强制类和文件名之间的1:1对应关系不同,C ++基本上完全忽略了文件名。因此,要解决两个类(都名为A)之间的冲突,可以使用名称空间:

//file1.h:
class A 
    void Func();
};

//file1.cpp:
A::Func() {}

//file2.h:
namespace f2 { 
class A { 
    void Func();
};
}

// file2.cpp:

namespace f2 { 
    A::Func() {}
}

// main.cpp
#include "file1.h"
#include "file2.h"

int main() {
    A f1a;
    f2::A f2a;

    f1a.Func();  // invokes Func declared in file1.h, which is in global namespace
    f2a.Func();  // invokes Func declared in file2.h, which is in namespace f2
    return 0;
}

通过动态调用不清楚你的意思。动态调用听起来很像使用多态函数,这需要一个公共基类:

struct base { 
    virtual void Func() = 0;
};

struct A1 : public base { 
    virtual void Func() {}
};

struct A2 : public base { 
    virtual void Func() {}
};

int main() { 
    A1 a1;
    A2 a2;
    base *b[2] = { &a1, &a2 };

    b[0]->Func(); // invokes A1::Func()
    b[1]->Func(); // invokes A2::Func()
    return 0;
}