2016-02-15 29 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++疯狂)。 –