2010-03-02 7 views
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는 작동하지 않습니다.

답변

7

, 당신은 적절한 공간에서 개체를 선언 전달해야합니다. 원래 개체가 전역 네임 스페이스에 있으므로 전역 네임 스페이스에서이를 선언해야합니다.

당신이 마음에 들지 않으면, 당신은 항상 당신의 자신의 구조에서 일을 마무리 할 수 ​​있습니다

namespace foo { 
struct libDataWrapper; } 

하고 자신의 CPP의

는이 구조를 정의합니다. 또는 당신이 항상 그런 일에 종사하고 있다면 당신은 항상 무효 *와 같은 것에 의지 할 수 있습니다.

+3

코드를 포맷하려면 "01"버튼을 사용하십시오. –

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

} 
1

제 3 자 라이브러리에 대한 포함을 자체 네임 스페이스에 간단히 줄 수는 없습니까?

namespace ThirdParty { 
#include "thirdparty.h" 
} 

namespace foo { 

    ... your code 

    ThirdParty::LibData *d; 

} 
+1

링커 오류가 발생할 수 있습니다. – UncleBens

관련 문제