2010-12-23 57 views
6

当我使用pimpl习语时,将所有方法定义放入类定义中是否是个好主意?例如:将所有方法定义在类定义中

// in A.h 

class A { 
    class impl; 
    boost::scoped_ptr<impl> pimpl; 
public: 
    A(); 
    int foo(); 
} 

// in A.cpp 

class A::impl { 
    // method defined in class 
    int foo() { 
     return 42; 
    } 

    // as opposed to only declaring the method, and defining elsewhere: 
    float bar(); 
}; 

A::A() : pimpl(new impl) { } 
int A::foo() { 
    return pimpl->foo(); 
} 

据我所知,有把一个方法定义一个类定义的唯一问题是, (1)实现是在包括类定义,并 文件可见(2 )编译器可能会使该方法内联。

在这种情况下,这些并不是问题,因为类是在私人文件中定义的,并且由于仅在一个地方调用方法,所以内联无效。

将定义放入类中的好处是您不必重复方法签名。

那么,这是行吗?还有其他问题需要注意吗?

+0

什么是__private__文件? – ezpz 2010-12-23 09:51:58

+0

@ezpz:这不是C++的概念。它只是一个文件,类的用户不会#include,因此实现中的更改不会影响它们。 – Amnon 2010-12-23 10:16:29

回答

3

我想你回答了你自己的问题:两种解决方案都是相同的。

但是,我不太确定'内联不起作用,因为方法只在一个地方被调用':当函数没有内联时,可能会有另一个调用存在。但是很有可能编译器足够聪明,可以将它们从外部类的单线转发调用中优化出来。

最后,我认为这只是一个品味问题。

1

通常我不会将方法添加到Impl内部类中,但是如果您定义了内联方法,则看不到任何问题。在我看来,比单独声明和定义更可读。

0

编译器内联的方法取决于编译器和传递的参数。

在pimpl习语的情况下,我认为这些方法是否在Imp的身体内定义并不重要。我个人喜欢在外面定义它们,因为很容易看出真正重要的东西(如成员变量和方法列表)。

2

优点:

  • 类的所有代码本地化

缺点:

  • 较大类:需要滚动时,就知道比较难哪该功能所属的类。
  • 当函数驻留在所有类声明之后时,更容易解决依赖关系。否则,可能需要将某些类声明移动到其他类之后,并且在类声明之后仍然需要移动一些函数,这是因为内部类存在相互依赖关系。