2013-10-10 50 views
2

我有一個基類Base
從它派生的兩個類:DerivedADerivedB。在這兩個類的頭文件中,我包含了Base.h
然後,在我的source.cpp我定義我的main,如果我只包括DerivedA.h,它工作正常。如果我只包括DerivedB.h它也可以正常工作。問題是我不能包括兩個。
每當我包括,編譯器生成一堆錯誤像C++包含兩個派生自相同基類的類

  • 左「.debit」必須有類/結構/聯合
  • ‘爲getBalance’:不是‘的CheckingAccount’
  • 成員

我想問題是,當我包括兩個頭,Base.h包括兩次。我應該如何包含這些頭文件?

回答

7

如果問題只是頭文件,而不是deadly diamond of death的情況,那麼您可以在頭文件中使用#pragma once,這樣可以確保在構建過程中它只會連接一次。

或者,你可以換你的頭文件中是這樣的:

#ifndef HEADER_H_ 
#define HEADER_H_ 

// The content of the header file goes here... 

#endif 

通過使用預處理器#ifXXXX語句,你可以告訴編譯器只包括文件如果宏尚未預定義。

+4

*注意:*'#pragma once'被很多編譯器支持,但它不是標準的C++。替代版本(「include guard」)適用於每個C++編譯器。 – dyp

+0

你的意思是「*你可以告訴編譯器只包含文件,如果宏是**不是**已經預先定義*」? – 2013-10-10 03:49:09

+1

另請注意:#pragma曾經很多,比包括大型項目的守衛要快得多 –

-1

當你從兩個來自同一個基地的類繼承時,你應該嘗試在繼承時使用關鍵字「虛擬」。它可以幫助你解決我相信的虛擬表中的混淆問題。示例查找虛擬繼承。

+1

我甚至沒有在我的問題中提及「虛擬」,我知道如何使用這個關鍵字。 – octref

+0

這不是解決多重繼承問題的方法嗎?也許我讀錯了,因爲你不在鑽石繼承的情況下。 –

+0

@JohnYang - 這是解決**一些**多重繼承問題的方法。而且,是的,這可能不會解決任何問題,儘管這只是猜測,因爲問題包含**無代碼**。 –