假设我有一个函数drawImage
,它需要很多参数,其中一些是WinApi类型,如HWND
,HDC
等等;而且我不想在我的班级标题中导入所有这些内容。但是我需要从我的班级方法中调用它。
extern void drawImage();
class A {
private :
int n;
// ...
public :
// ...
void draw() {
drawImage(n);
}
};
上面的代码给出了预期的错误:drawImage does not take one argument
。那么我怎么能实现这个目标呢?
此外,我不想在包含WinApi内容的源文件中定义我的成员函数。
更新
extern void drawImage();
extern int a;
extern unsigned long int b;
...
extern "C" void c;
class A{
private :
int n;
...
public :
...
void draw(a,b,c){
drawImage(a,b,c,n);
}
}
这可以成为一个很好的解决方案,但Visual Studio不允许extern void
声明。
答案 0 :(得分:2)
只需在.cpp文件中定义void A::draw()
不在线(例如A.cpp
)。
在那里,您可以包含完整的drawImage
声明,并从A.h
中删除该声明。
如果这还不够,也就是说,您希望将WinApi内容与代码完全分开,则只需更进一步。您的A.cpp
看起来像是:
#include "A.h"
namespace winapi {
// Wrapper function for WinApi's drawImage,
// with the parameters we actually care about
void apiDrawImage(int, unsigned long, int);
}
void A::draw(int a, unsigned long b) {
apiDrawImage(a,b,n);
}
然后您在另一个.cpp文件中实施winapi::drawImage
,比如winapi.cpp
:
// Declares the actual drawImage() function
#include <WinApiStuff.h>
namespace winapi {
void apiDrawImage(int a, unsigned long b, int n) {
// Forward to WinApi
::drawImage(/* ... */);
}
}
然后winapi.cpp
将是唯一了解WinApi的文件。
奖励点:如果您编译并链接启用LTO(-flto
用于GCC和Clang),所有这些都可以跨翻译单元内联,最终绝对没有开销!