2016-11-17 67 views
-2

我覺得這是一個非常有吸引力的編程風格定義一個結構/類的所有方法直接內嵌在結構,如只定義結構是這樣的:類方法聯定義

"A.hpp" 
class A; 

"A.cpp" 
class A 
{ 
    A() = default; 
    void method() { } 
}; 

而不是

"A.hpp" 
class A 
{ 
    A(); 
    void method(); 
}; 

"A.cpp" 
A::A() = default; 
void A::method() { } 

這意味着將類/結構定義放在代碼文件中,並且只在頭文件中包含聲明。

但是,當編譯器需要知道其他代碼文件中的struct/class佈局時,會遇到這些問題。

是否有支持這種編程風格?也許只能通過獲得者/設置者來獲取和設置字段?然而,這種方式會導致大量的樣板。

只要在頭文件中包含struct/class定義,就會導致相互遞歸的頭文件出現問題,除非明確地將聲明置於另一個頭文件中。

我可以通過模塊系統以D語言實現這種編程風格,但是如何在C++中實現它?

+0

要使用一個類時,編譯器需要知道它含有(以確定其大小)哪些變量,哪些成員函數它(這樣它可以生成符號鏈接)。因此,類定義必須始終在任何實際使用該類的文件中可見(即,除了聲明指針或引用它之外,幾乎沒有其他任何文件)。雖然你的想法是一個有效的選擇(儘管可能會減慢編譯速度和/或使類的定義看起來很亂),但如果將類的定義放在源文件中,則會出錯。 –

+0

C++編譯模型使得你正在嘗試做的事情變得不可能。 – SergeyA

+0

我投票結束這個問題作爲題外話,因爲它是不可能做OP的願望。 – SergeyA

回答

0

你在做什麼叫前向聲明。

除了一個.cpp文件,您在其中定義它之外,您將無法在其他所有翻譯單元中使用此類執行任何操作(即調用方法,創建實例)。所以,這個想法是完全無用和不好的。你會得到一連串的鏈接錯誤。

所以,你需要堅持風格#2。或定義在頭文件內聯方法,這樣

struct A { 
    A() {} // something 
    int func() { /* function body */ 
} 
+0

我認爲你誤解了這個問題。我理解技術原因爲什麼我不能這樣做,爲什麼問題是我該如何解決這個問題。 – sprw121

+0

@ sprw121沒有辦法像你想要的那樣去做。 也許,您可以創建另一個標題,將整個類定義放入原始標題中。但這仍然很難看 – Starl1ght