看板 C_and_CPP 關於我們 聯絡資訊
問題點應該有兩個, 有錯請指正 1.不想要被 class_a->doSomething() 這行程式碼搞炸掉 2.當 testp == NULL時, 不想造成存取違規 可以自己寫一個類別, 類似標準庫裡的 smart ptrs template <typename Type> class SmartPointer { private: Type *p; public: SmartPointer() : p( 0 ){ } public: ~SmartPointer(){ delete p; } public: Type* operator->() { if( p == 0 ) throw runtime_error("NullPointerException"); return p; } // 其他略 }; 在他沒有參考到任何物件時, 對其存取都會造成例外被丟出 , 不必在成員函式內判斷this == NULL( 之前推的繼承也很 方便). 第二個問題我覺得 CLASSA 應該改成這樣 : class CLASSA { public: // 沒有預設建構子 CLASSA( ... ) : testp( new int ... ) {} ~CLASSA() { delete testp; } private: int *testp; }; testp 也可以用 smart ptr來指( 每當有任何一個成員配置 失敗, 記憶體可以馬上被收回 ), 只是又會回到前面的情況 (判斷會太過繁複). 所以我通常會用 Pimpl idiom 來免除這個問題 // xxx.cpp struct CLASSA_Impl { int *testp; CLASSA_Impl( ... ) : testp( new int ... ){ } ~CLASSA_Impl(){ delete testp; } // 如果有其他成員, 也可以在 isValid() 一併做判斷 bool isValid() { return testp != 0; } }; // xxx.hpp class CLASSA { public: // 沒有預設建構子 CLASSA( ... ) : pImpl( new ... ) {} ~CLASSA() { delete pImpl; } int CLASSA::doSomething() { if( pImpl->isValid() ) // 作你想做的事 else return 1; return 0; } private: struct CLASSA_Impl *pImpl; }; -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢█歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/29 13:44)
bleed1979:感謝您的教導,我試著做做看。 10/29 13:43