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
答案 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;
}