2015-08-08 31 views
-2

我有以下代碼:定義常量在實現文件

了foo.h:

include "Bar.h" 

class Bar; 

class Foo { 
    const Bar mBar; 

public: 
    Foo(const Bar &bar); 
}; 

Foo.cpp中:

#include "Foo.h" 

Foo::Foo(const Bar &bar) : mBar(bar) {} 

我收到以下編譯錯誤:

'Foo::mBar' uses undefined class 'Bar'

是const定義n不允許在實施文件中?

顯然在這種情況下,我可以將ctor實現移動到頭文件中。

但是,如果我想調用Bar ctor,可能需要前向聲明而不是複製ctor,並仍然保持Bar成員變量不變,那麼什麼是替代方法? 因此,例如:

了foo.h:

include "Bar.h" 

class Bar; 
class BaraParams; 

class Foo { 
    const Bar mBar; 

public: 
    Foo(const BarParams &barParams); 
}; 

Foo.cpp中:

#include "Foo.h" 

Foo::Foo(const BarParams &barParams) : mBar(barParams) {} //call bar ctor 

Bar.h:

include "BarParams.h" 

class Bar{ 
public: 
    Bar(const BarParams &barParams); 
}; 

還是我不這樣做對嗎?我甚至不知道這是否是一個好主意。

+1

編譯錯誤與'const'限定符無關。由於'mBar'既不是引用,也不是指向Bar的指針,編譯器需要知道Bar的大小,當編譯器遇到mBar成員變量時需要定義Bar。 – foobar

+0

嗯所以我只能使用參考或指針? –

+0

不,你也可以在'Foo'前面定義'Bar'來使用簡單的'Bar'。類成員的定義通常在頭文件中完成,所以如果你正確地組織你的源代碼,那麼'Bar'類的相應頭文件的'#include'預處理器指令就足夠了。 – foobar

回答

0

頭文件必須包含條頭文件。 全事情是這樣的:

include "Bar.h" 

class Foo { 
    const Bar mBar; 
    //because it is Bar and not Bar& or Bar* forward declarations are not possible 

public: 
    Foo(const Bar &bar); 
}; 

可以而且應該在以下情況下

class Foo { 
    const Bar& mBar; 

public: 
    Foo(const Bar &bar); 
}; 

使用前向聲明,但隨後欄包括了存在於實現文件。
同樣的道理可以應用在這裏,而不是這樣的:

include "BarParams.h" 

class Bar{ 
public: 
    Bar(const BarParams &barParams); 
}; 

做到這一點:

class BarParams; 

class Bar{ 
public: 
    Bar(const BarParams &barParams); 
}; 

這樣做避免不必要包括在你的頭文件,使你的編譯器有很多的生活更輕鬆。在大型項目中,編譯時間可以顯着減少。

+0

在我的真實代碼中,這太大了,無法粘貼在這裏我使用stdafx.h來保持所有包含。並且包括stdafx.h ..也許這就是問題所在? –

+0

如果我除了參考BarParams之外還想做任何事情,現在我會遇到一堆不完整的類型錯誤。 –

+0

包含在實現文件中需要。也請看看這個http://stackoverflow.com/questions/9906402/should-one-use-forward-declarations-instead-of-includes-wherever-possible –