推 bleed1979:感謝您的教導,我試著做做看。 10/29 13:43
問題點應該有兩個, 有錯請指正
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)