[英]Is it ok to declare/define a static method in the .cpp only?
在許多情況下,我發現我的類需要私有函數來分解它們的功能並重用代碼。 典型的實現方式是:
MyClass.h
#include "AnotherClass.h"
class MyClass {
public:
float foo() const;
private:
float fooPrivate(const AnotherClass& ac) const;
}
MyClass.cpp
#include "MyClass.h"
float MyClass::foo() const {
return fooPrivate(AnotherClass());
}
float MyClass::fooPrivate(const AnotherClass& ac) const {
return ac.foo();
}
這沒關系,但在以下情況下,在頭文件中聲明fooPrivate()可能會有問題:
我們可能不希望在頭文件中包含AnotherClass,如果它僅供內部使用,並且在MyClass之外不需要。
如果需要許多私有函數,我們冒着使用不必要的私有函數來污染頭文件的風險,這些函數會使代碼不太清晰,增加編譯時間並且更難以維護。
我知道解決所有這些問題的Pimpl成語,但我的問題是如果我們不想使用Pimpl是否可以為一些函數做這樣的事情?
MyClass.h
class MyClass {
public:
float foo() const;
}
MyClass.cpp
#include "MyClass.h"
#include "AnotherClass.h"
static float fooPrivate(const AnotherClass& ac) {
return ac.foo();
}
float MyClass::foo() const {
return fooPrivate(AnotherClass());
}
在這種情況下,不需要在MyClass.h中包含AnotherClass.h,除了MyClass.cpp內部以及聲明之后,任何人都不能調用fooPrivate()。 我對嗎?
是否有任何警告使用這個或當我的程序變大時我會遇到問題嗎?
實際上,不僅可以,我實際上會推薦它。
private
功能可以使用,有時還必須 (訪問私有元素時),但是這里有一個問題與他們同在,即使它只是一個聲明,他們雜亂的類定義:類的用戶應該不會有照顧或暴露到班級內部。
另一方面,在源文件中的匿名命名空間中聲明的static
函數或函數是“空閑的”。 不管你有多少人:
但是,如果存在一個缺點,那就是在那些與Itanium相關的工具鏈上,如果沒有調試符號,它們缺少名稱會導致較差的回溯。 但是,它可以被視為輕微的不便。
注意:沒有直接訪問類的private
成員很少是一個問題,因為類的方法可以很容易地將對這些成員的引用傳遞給它們。 它確實意味着當構造函數不公開時,它們無法構建類的實例。
除了輕微的不便之外,沒有任何警告。 顯然,你的靜態函數不會是一個類方法。 因此,它只能訪問公共類成員和方法。
由於你的輔助函數只使用類的公共接口,所以使用只在類implementation-file中可用的靜態函數是可以的。
無論如何,你的例子實際上並不需要AnotherClass
的定義,一個輕量級的前向聲明就可以了:
class AnotherClass;
另外,我將標志着該功能inline
在一般原則這兩種情況下,當且僅當它是由實現只使用,這是所有在同一個翻譯單元:
可能會有更好的性能/更小的代碼,沒有任何缺點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.