2016-11-22 35 views
13

我在一個類的C++前向聲明中發現錯誤,錯誤地聲明爲struct Book而不是class Book。我認爲Book曾經是一個結構體,變成了一個類,但是前面的聲明仍然存在。作爲結構體對類的前向聲明

Book.h:

class Book { 
    ... 
}; 

Library.h:

struct Book; 

class Library { 
    std::vector<Book*> books; 
}; 

有沒有編譯器警告和生成的程序似乎正常工作。它讓我感到好奇:理論上,這會造成問題嗎?這只是一個指針,是的,但例如,如果該類有虛擬方法,多重繼承,指針可能會不同?

我知道關於默認public/private的類/結構體之間的差異,但我特別提出了前向聲明和交換它們的可能後果。

+5

這不是C++中的錯誤,但是VS可能給你一些悲痛。 – juanchopanza

+0

@Danh編輯的問題來解釋區別。 –

+0

相似問題:http://stackoverflow.com/questions/4866425/mixing-class-and-struct –

回答

14

structclass就前向聲明而言是完全可以互換的。即使對於定義,它們也隻影響對象成員的默認訪問說明符,其他所有內容都是等效的。你總是定義對象的「類」。

struct必須在class以上使用的唯一地方是當正向聲明綁定的不透明數據時。


關於您的編輯:

我知道類/結構之間的差異就默認的公共/私有,但我專門問向前聲明和交換他們的可能後果。

Visual C++產生警告C4099。它這樣做,因爲它的功能的名稱裝飾包含您使用的關鍵字。因此,程序可能無法正確鏈接。因此,當使用VC++(微軟公司的骨頭移動,AFAIC)時,完全符合標準的代碼可能無法鏈接。

此警告的討論,以及爲什麼它可以,如果你是紀律被忽略,可以發現here

+0

謝謝你的答案。爲了安心和避免任何編譯器怪癖和未來可能的精神病維護者的憤怒,我會使所有的前瞻性聲明相匹配。 –