在很多情況下,我發現我的類需要私有函數來分解它們的功能並重用代碼。典型的實現將是:可以在.cpp中聲明/定義靜態方法嗎?
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方法,解決了所有這些問題,但我的問題是,如果我們不希望使用平普爾是否確定了幾個功能做這樣的事情?
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());
}
在這種情況下,不需要它包括AnotherClass.h在MyClass.h和fooPrivate()不能被任何人稱爲除了MyClass.cpp內部和聲明之後。我對嗎?
是否有任何使用此警告的注意事項,或者當我的程序變得更大時,我是否會遇到問題?
在我看來,你的私人成員函數'fooPrivate'本來可以是靜態的。否則,你的第二種方法就不能很好地工作。 – 2014-10-19 14:52:39
你知道,'AnotherClass'的前向聲明就足夠了。這足夠輕量。 – Deduplicator 2014-10-19 14:54:04
我瞭解你。然而,這一點仍然是一樣的。即使fooPrivate()使用MyClass的某些成員(這會使其成爲非靜態的),但在很多情況下,可以使用靜態函數來執行某些內容,然後可以使用靜態調用的結果來修改此類。 – 2014-10-19 14:57:36