可以檢查(例如通過gcc)哪些方法或成員可以被移動到受保護或私有部分?確定方法或成員是否可以被保護或私有
回答
考慮下面的代碼部分:
class foo{
protected:
void foo_method_1(){};
int foo_member_var;
};
class bar : public foo{
void bar_method_1(){
foo_method_1();
}
};
如果要確定哪些成員和Foo類的方法可以是私有的,你必須對所有這些移動到私人部分。因此,它看起來就像這樣:
class foo{
private:
void foo_method_1(){};
int foo_member_var;
};
...
現在,它不會編譯,這裏的海灣合作委員會拋出的第一個錯誤:
prog.cpp:5:8: error: 'void foo::foo_method_1()' is private
void foo_method_1(){};
從你知道,你必須將foo_method_1移到受保護部分。所以它看起來像這樣:
class foo{
private:
int foo_member_var;
protected:
void foo_method_1(){};
};
...
現在它會編譯。您必須爲班級中的每一種方法和成員重複此過程。對於公共部分,您可以按照上述相同的方式進行操作。
我知道這種方法,但它很耗時。 – Marcin
@marcin不幸的是。爲了加速它,你可以像這樣編譯你的代碼:'gcc -o foo bar.cpp 2> errors'然後'cat errors | grep「是私有的」。你將得到一個不能私有的函數列表。然後你可以一次把所有的人移動到受保護的位置。 –
您不能以編程方式執行此操作,否。 這實際上是一件好事。
當然,你可以創建一個工具,用C++解析器集成,然後—一個接一個—取得了一定的會員功能private
留下任何那裏,沒有引起你的程序中的錯誤。
但是,爲了做到這一點,您的整個程序需要對該工具可見。也許如果你有一個簡單的項目,這不是一個問題,但如果你正在編寫一個字面上不可能的庫。
即使你能做到這一點,你最終的班級設計將是一個絕對的混亂。 只有人類程序員知道API的哪些部分是爲公共消費而設計的,而不是,並且這與API的哪些部分是當前正在消費並不總是相同。
堅持手動的方式,但不要複製機器的方式,隨機猜測什麼是編譯和什麼不編譯。用你的大腦和你對這個班級應該做什麼的記憶,來確定哪些功能應該是public
,哪些不應該。
理想情況下,在您首次設計您的課程時試圖讓它正確!你應該花更多的時間來設計你的程序,而不是實際編程它,否則你很快就會得到這樣的維護噩夢。
否。編譯器會看到您的代碼,而不是您的設計。
- 1. 註釋或其方法是否可以使用私有,默認或受保護的訪問修飾符?
- 2. 函數或方法或函數成員或方法成員?
- 3. 私有成員沒有被Java中的子類繼承(或可以覆蓋)?
- 4. 將私有或受保護的方法轉換爲公開
- 5. ejabberd:有沒有一種方法可以確定用戶是否是管理員?
- 6. 確保私有/受保護方法的輸入?
- 7. 訪問軌私人/保護方法通過JavaScript或jQuery的
- 8. 受保護的和私有的方法
- 9. 將私有方法更改爲受保護或包私有單元測試 - 好還是不好?
- 10. 有沒有辦法以編程方式確定私鑰是否在DER或PEM中編碼?
- 11. 具有所有私人成員的課程是否可以成爲POD課程?
- 12. 私人會員不會被繼承或只是無法訪問?
- 13. 有什麼方法可以確定它是否是測試(.NET)?
- 14. 有無論如何定義公共或私人或受保護的類在PHP
- 15. 爲什麼要調用受保護的或私有的CSharp方法/變量?
- 16. 是否可以同步數據成員而不是方法?
- 17. C++:允許訪問受保護的類的成員,而不是私人成員
- 18. 是否可以擁有財產,可以是或虛假或數組或空
- 19. 將私有方法更改爲受保護以進行測試
- 20. 暴露成員或使它們在Python中是私有的?
- 21. 推薦在javascript模塊中確定私人成員的方法
- 22. 不能訪問私有保護成員的迭代器PHP
- 23. C++繼承中的保護和私有成員變量
- 24. Java通過受保護的getter訪問私有超類成員
- 25. javadoc所有 - 私人,公共和受保護的成員
- 26. 當在C#或Java中進行子類化時,是否可以重寫私有成員?
- 27. 是否有啓發式來確定方法或字段是否屬於類中?
- 28. 有什麼方法可以確定iPhone是否在漫遊?
- 29. PHP/Magento:是否可以編輯對象中的「受保護」成員?
- 30. 可以wicked_pdf或wkhtmltopdf生成受保護的pdf嗎?
您可以將它們全部移至私有,然後檢查編譯器引發的錯誤。然後,根據錯誤信息,您可以將它們逐一移動到受保護的位置,以便派生類可以訪問它們。 –
你的意思是說,公共API的哪些方法是未使用的(因此可以變成私有的)? – Niall
它應該是指示哪種方法應該公開的API。 – Jarod42