[英]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.