簡體   English   中英

是否可以僅在.cpp中聲明/定義靜態方法?

[英]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 ABI編譯器工具鏈(例如)上,它們不會導致導出符號,從而加快了加載時間

但是,如果存在一個缺點,那就是在那些與Itanium相關的工具鏈上,如果沒有調試符號,它們缺少名稱會導致較差的回溯。 但是,它可以被視為輕微的不便。

注意:沒有直接訪問類的private成員很少是一個問題,因為類的方法可以很容易地將對這些成員的引用傳遞給它們。 它確實意味着當構造函數不公開時,它們無法構建類的實例。

除了輕微的不便之外,沒有任何警告。 顯然,你的靜態函數不會是一個類方法。 因此,它只能訪問公共類成員和方法。

我偶爾這樣做,因為“幫助函數”在類的公共接口中幾乎沒有任何用處。 我嘗試最小化這種模式的使用,因為無法訪問private變量。 然而,免費的功能是一件好事可以說甚至增加封裝

由於你的輔助函數只使用類的公共接口,所以使用只在類implementation-file中可用的靜態函數是可以的。

無論如何,你的例子實際上並不需要AnotherClass的定義,一個輕量級的前向聲明就可以了:

class AnotherClass;

另外,我將標志着該功能inline在一般原則這兩種情況下,當且僅當它是由實現只使用,這是所有在同一個翻譯單元:
可能會有更好的性能/更小的代碼,沒有任何缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM