2

我想使用第 3 方库而不使用其头文件。我的代码位于它自己的命名空间中,因此我不能使用常规的前向声明,因为我不想污染全局命名空间。目前我有这样的事情:

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 不起作用。

4

3 回答 3

7

要使前向声明起作用,您需要在正确的命名空间中前向声明一个对象。由于原始对象驻留在全局命名空间中,因此您需要在全局命名空间中前向声明它。

如果你不喜欢这样,你总是可以把东西包装在你自己的结构中:

namespace foo {
struct libDataWrapper; }

并在您自己的 cpp 中定义此结构。或者,如果您愿意的话,您可以随时诉诸 void* 之类的东西。

于 2010-03-02T09:53:28.153 回答
2

因为您使用的是指针,所以 i''' 只需在您自己的命名空间中前向声明一个虚拟对象,然后使用 reinterpret_cast 将实际对象绑定到现有指针。

你的来源.h

namespace foo {

//forward declare
class externalObj;

class yourObj
{
public:
  yourObj();
  ~yourObj();
  void yourFunction();

private:
 externalObj* pExt;
};

}

你的实现.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();
}

}
于 2010-03-02T09:40:35.063 回答
1

你不能简单地将第三方库的包含包装在它自己的命名空间中吗?

namespace ThirdParty {
#include "thirdparty.h"
}

namespace foo {

  ... your code

  ThirdParty::LibData *d;

}
于 2010-03-02T11:14:15.707 回答