簡體   English   中英

C ++中的struct類成員

[英]struct class member in C++

我是新手,正在學習C ++,此代碼是有效的C ++實現,請參見下面的代碼,

// FoomImpl.h
#include "Foo.h"

namespace FooFoo { namespace Impl {

class FooImpl
{
   public:
      FooImpl( FooFoo::CFoo::stBar bar )
      {
         m_bar = bar;
      }

   private:
      FooFoo::CFoo::stBar m_bar;
};

} }

// Foo.h
#include "FoomImpl.h"

namespace FooFoo {

class CFoo
{
 public:
    struct stBar
    {
       int aBar;
    };

 public:
    CFoo( stBar bar ) : impl(NULL)
    {
       impl = new FooFoo::Impl::FoomImpl( bar );
    }

    CFoo( ) : impl(NULL){}
    ~CFoo( )
    {
       if(impl)
         delete impl;
    }

 private:
    FooFoo::Impl::FoomImpl *impl;
};
}

非常感謝。

不,由於您具有循環依賴性,因此需要前向聲明

你不能讓兩個不同的對象相互堆疊在堆棧上,因為當編譯器遍歷一個對象的頭文件時,它現在需要它所有數據成員的大小,以便知道對象本身的大小。 在你的情況下顯然是不可能的。

您可以通過將CFoo構造函數移動到一個cpp文件中,然后在該類上方的Foo.h中編寫class Impl::FoomImpl; 這稱為前瞻性聲明。 它只是告訴編譯器這是一個類名。 這足以使用指向該類的指針。 現在Foo.h不再需要包含FoomImpl.h,因為它只使用指向Impl::FoomImpl的指針,該指針具有已知大小(最可能是4個字節)。

如果您在某個命名空間中,則無需指定范圍...

namespace FooFoo
{
   //no need to use "FooFoo::" here
}

為了避免進一步的混亂,我建議您減少名稱空間的數量。 除非您正在開發一個將由其他開發人員使用的庫,否則即使您的類名明確無誤,也幾乎不會使用任何庫。 就個人而言,在最終用戶軟件中,我僅使用它們來定義枚舉的范圍,並且為類給出了明確且明確的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM