2

ヘッダーファイルを使用せずにサードパーティのライブラリを使用したい。私のコードは独自の名前空間に存在するため、グローバル名前空間を汚染したくないため、従来の前方宣言を使用できません。現在、私はそのようなものを持っています:

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を使用して実際のオブジェクトを既存のポインタにバインドします。

your-source.h

namespace foo {

//forward declare
class externalObj;

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

private:
 externalObj* pExt;
};

}

your-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();
}

}
于 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 に答える