2016-02-15 56 views
3

有沒有一種方法可以將方法範圍分組到特定的類,而無需每次都使用範圍操作符操作符?在某些情況下可能會引起蔑視,我可以粗略地類比JavaScript with聲明;然而,在這裏它被用在源代碼中,並沒有被執行。C++範圍運算符分組?

簡化示例:想象一個Cheese類,與weighshred,和melt功能聲明如下:

class Cheese { 
    public: 
     Cheese(); 
     ... // other constructors, copy, etc. 
     ~Cheese(); 
     int weigh(); 
     int shred(); 
     int melt(); 
} 

典型地,該功能定義如下:

Cheese::Cheese() { //constructor stuff }; 
... // other constructors, copy, etc. 
Cheese::~Cheese() { //destructor stuff }; 
int Cheese::weigh() { return weighed; } 
int Cheese::shred() { return shredded; } 
int Cheese::melt() { return melted; } 

是否有一種說法,「嘿編譯器,所有這些定義的範圍是Cheese類。」

也許是這樣?

scope::Cheese { 
    Cheese() { //constructor stuff }; 
    ... // other constructors, copy, etc. 
    ~Cheese() { //destructor stuff }; 
    int weigh() { return weighed; } 
    int shred() { return shredded; } 
    int melt() { return melted; } 
} 

,或者

Cheese:: { 
    Cheese() { //constructor stuff }; 
    ... // other constructors, copy, etc. 
    ~Cheese() { //destructor stuff }; 
    int weigh() { return weighed; } 
    int shred() { return shredded; } 
    int melt() { return melted; } 
} 
+0

不,不知道如何處理模板奶酪,即使沒有。 – xaxxon

+2

對於它的價值,我認爲這是C++中最愚蠢/令人討厭的方面之一。 –

+0

@xaxxon爲什麼模板會成爲問題? –

回答

2

不是定義函數定義塊本身(它有各種潛在的缺點)的其他方法,沒有,沒有任何辦法做到這一點。

至少部分原因是爲了確保與名稱空間不同的類不能被「重新打開」以添加額外的成員。

+0

「不」不是真的回答質量。這更多的是評論。 – xaxxon

+0

@xaxxon但這是正確的答案。還有什麼可說的? –

+0

請進一步解釋「'重新打開'以增加其他成員的含義。 – kmiklas

0

可以

  • 完全定義方法的類定義,或

  • 除了構造函數和析構函數,用於執行使用typedef簡短類名。

還有一些不太實際的可能性,其中包括源代碼預處理。


例子:

class Cheese 
{ 
public: 
    Cheese(); 
    //... // other constructors, copy, etc. 
    ~Cheese(); 
    auto weight() -> int; 
    auto shred() -> int; 
    auto melt() -> int; 
}; 

using X = Cheese; 

Cheese::Cheese() {} 
Cheese::~Cheese() {} 

auto X::weight() -> int { return 0; } 
auto X::shred() -> int { return 0; } 
auto X::melt() -> int { return 0; } 

auto main() -> int 
{ 
    return Cheese().weight(); 
} 

就我個人而言我希望更多的圖書館只有頭部,在類定義的方法定義。僅頭文件方法不能輕易處理模塊交叉依賴性,其中X的實現依賴於Y的接口,反之亦然,並且使用當前1960年的構建技術,它可能導致不切實際的構建時間。但是後一個問題在哪裏可以解決,通常可以通過在問題上注入更多的硬件來解決,而幸運的是,第一個問題很少見。

+1

I '不確定'X ::'比'Cheese ::'更好 - 顯式範圍定義語法中最醜陋的一部分(至少在我看來)是'::'。也許'#define impl auto Cheese ::'在文件的末尾加上'#undef impl',用於類Rust的語法(即驅動你的同事ke C++瘋狂)。 –