一直以來寫代碼都是拷貝爲主,編寫爲輔。通常都是套用現成框架,本身寫一下功能模塊。有時候自我感受良好,寫代碼也不是多麼難的事,不過是把處理流程轉換成計算機語言罷了。最近開始本身重頭寫項目,才發現有那麼多煩心事。基本上每一個功能都不是什麼難事,可是要組裝起來還真的費勁。html
我之前還覺得c++是跨平臺的。直到我打算把我本身在windows下寫的代碼移植到arduino上。首先我要解釋一下我這麼作的緣由:c++
總之就是,既然能在電腦上開發運行,爲何要在板子上弄呢?
因而沒過多久我就留下了悔恨的淚水。
當我開心地把寫好的代碼拿去編譯的時候,編譯器就給了我一個大嘴巴子。滿屏都是error,這個說缺成員函數,那個說類型不符。仔細地看了看錯誤,而後就發現c++所謂的標準庫並不標準,每一個平臺下都有點小差別,缺點東西也正常畢竟單片機平臺有限。而後我就想,少什麼就加什麼唄。shell
問題比較大的是string類型。通常咱們用的是std::string,可是arduino本身有個String。那麼我自定義一個類NString 繼承std::string,而後實現一些String的方法;
遺憾的是,編譯器再次當頭棒喝。ArduinoJson 這種庫裏面已經針對現有的String或是std::string作處理。具體緣由不是很清楚,C++的模板又把問題的難度上升一個臺階。基本狀況就是,在原有的第三方庫中是使用String的。當我把NString做爲模板類型傳入時,須要一個String到NString的轉換。惟一的方法是在String類裏添加一個重載函數。艹!!windows
我忽然發現ArduinoJson本身實現了一套String。看來跨平臺的關鍵是不要用別人的東西。可是當我翻看像string這種常見的類的實現時,我膽怯了。花了很多時間又去看了下模板。坑點太多。最後選擇了一個偷懶折中的方案。當使用字符串時,通通取.c_str(),轉成const cahr*。當遇到不兼容的成員函數。如find_first_of時,轉用函數寫法。
即用find_first_of(String&)來解決。框架
若是一開始就用C,或者只用函數而不是類去解決問題,那麼代碼的兼容問題將大大下降。固然這也不是C++的優點,C++比C更加易用。函數
若是是調用的話,C++確實比C好用太多了。可是反過來,在使用上佔的便宜,加倍地在開發上補回來。爲了修改我以前犯的錯誤,我要來回在好幾個有繼承關係的類切換作修改。看了一下人家的實現:工具
class JsonArray : public Internals::JsonPrintable<JsonArray>, public Internals::ReferenceType, public Internals::NonCopyable, public Internals::List<JsonVariant>, public Internals::JsonBufferAllocated
我忽然意識到,我就繼承一個類,上下連起來就是一條線,這麼麻煩搞抽象繼承還不如寫幾個函數指針。真的是任重道遠。開發工具
面向對象測試