【问题标题】:Forward declare a global type inside a namespace在命名空间中前向声明全局类型
【发布时间】:2010-03-02 08:58:47
【问题描述】:

我想使用第 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 不起作用。

【问题讨论】:

    标签: c++ forward-declaration


    【解决方案1】:

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

    如果您不喜欢这样,您可以随时将其封装在您自己的结构中:

    namespace foo {
    struct libDataWrapper; }
    

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

    【讨论】:

      【解决方案2】:

      因为您使用的是指针,所以我''' 只是在您自己的命名空间中前向声明一个虚拟对象,然后使用 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();
      }
      
      }
      

      【讨论】:

        【解决方案3】:

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

        namespace ThirdParty {
        #include "thirdparty.h"
        }
        
        namespace foo {
        
          ... your code
        
          ThirdParty::LibData *d;
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          • 2012-12-15
          • 2013-08-16
          • 2015-05-10
          相关资源
          最近更新 更多