我想在不使用其头文件的情况下使用第三方库。我的代码驻留在它自己的命名空间中,因此我不能使用传统的前向声明,因为我不想污染全局命名空间。目前我有类似的东西:
3rd-party-library.h----
typedef struct {...} LibData;
void lib_func (LibData *);
my-source.h-----
namespace foo {
/*forward declaration of LibData*/
class Abcd {
public:
void ghj();
private:
Libdata *data_;
};
}//namespace foo
my-source.cpp-----
#include "my-source.h"
#include <3rd-party-library.h>
namespace foo {
typedef ::LibData LibData;
void Abcd::ghj() {
//do smth with data_
}
}//namespace foo
是否可以以它将驻留在命名空间中的方式转发声明全局类型?简单的typedef不起作用。
答案 0 :(得分:7)
要使前向声明起作用,您需要在适当的命名空间中转发声明对象。由于原始对象驻留在全局名称空间中,因此需要在全局名称空间中转发声明它。
如果您不喜欢这样,您可以随时将事物包装在您自己的结构中:
namespace foo {
struct libDataWrapper; }
并在您自己的cpp中定义此结构。或者你可以随时使用void *之类的东西,如果你有这样的话。
答案 1 :(得分:2)
因为您正在使用指针,所以我只是在您自己的命名空间中声明一个虚拟对象,然后使用reinterpret_cast将实际对象绑定到现有指针。
您-source.h
namespace foo {
//forward declare
class externalObj;
class yourObj
{
public:
yourObj();
~yourObj();
void yourFunction();
private:
externalObj* pExt;
};
}
您-implementation.cpp
#include "your-source.h"
#include "externalObj-header.h"
namespace foo {
yourObj::yourObj() :
pExt ( reinterpret_cast<externalObj*>(new ::externalObj()) )
{
}
yourObj::~yourObj()
{
}
void yourObj::yourFunction()
{
reinterpret_cast<::externalObj*>(pExt)->externalFunction();
}
}
答案 2 :(得分:1)
难道你不能简单地将第三方库的include包装在自己的命名空间中吗?
namespace ThirdParty {
#include "thirdparty.h"
}
namespace foo {
... your code
ThirdParty::LibData *d;
}