[英]Macro Overriding Class Member
好的,我正在学习为多个平台编程,我看到很多包含/库使用宏来告诉编译器在特定平台上调用哪些函数。
所以我继续并定义了以下内容:
#if defined _WIN32 || defined _WIN64
#define Close(Handle) CloseHandle(Handle)
#else
#define Close(Handle) close(Handle)
#endif
但是我的Socket类有以下成员函数:
Socket::Close()
{
//Close socket and clean up..
}
当我执行以下操作时:
Socket sock(Port, LocalHost);
sock.Close();
我明白了:
error: 'class Socket' has no member named 'CloseHandle'
#define Close(Handle) CloseHandle(Handle)
^
note: in expansion of macro 'Close'
sock.Close();
^
任何想法我如何解决它或我应该摆脱关闭并使其成为typedef?
最简单的解决方案就是为宏使用另一个名称。
但这不是正确的做法:在某些平台上,您需要更复杂的逻辑来执行特定于平台的操作(例如,您可能需要在“关闭”之前执行类似'flush'的操作)。 所以最好在函数中隔离你的#ifdef
:
void Close(Handle handle) {
#if defined _WIN32 || defined _WIN64
CloseHandle(handle);
#else
close(handle);
#endif
}
Socket::Close()
{
//Close socket and clean up..
::Close(...);
}
如果你定义一个抽象类(这将是更优雅的Environment
,提供对所有系统特定动作的接口),并写出类的实现(在子类- WindowsEnvironment
, PosixEnvironment
)每个混凝土平台。 类的实例可以是全局可访问的单例,只需在项目中编译正确的源文件,就可以在没有宏的情况下选择适当的环境。
您应该为您的班级创建跨平台界面。 例如,您需要创建close()
方法。 此方法应存在于所有平台上。 如果实现在不同平台上有所不同,则应使用宏为每个平台添加单独的实现。 它应该在cpp
文件中完成。
.h文件:
void close(Handle handle);
.cpp文件:
void Socket::close(Handle handle) {
#if defined _WIN32 || defined _WIN64
CloseHandle(handle);
#else
close(handle);
#endif
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.