2012-07-29 52 views
1

我在C++類中封裝了一個與該結構相關的結構和函數。我應該使用轉換操作符來轉換結構嗎?

class Surface 
{ 
public: 
    operator SDL_Surface*() { return this->surf_; } // good idea? 
private: 
    SDL_Surface* surf_;  
} 

在這種情況下使用轉換運算符是個好主意嗎?或者我會遇到問題?任何替代品?

+0

我之前就做過這樣的事情,它已經成功了,但你可能不想這樣做,直到你找到一個真實的用例。 – 2012-07-29 16:22:24

+1

另一種選擇是具有合適名稱的成員。 'std :: string :: c_str'和'std :: unique_ptr :: get'就是這樣的成員的例子。 – 2012-07-29 16:29:56

回答

4

這是一個非常糟糕的主意。 SDL_Surface*應該完全封裝在類中,只有屬於SDL抽象的其他類才能訪問。另外,你應該聰明地指向它以確保它的安全銷燬。

+2

AMEN! (這是一個C++的答案或只是宗教?) – 2012-07-29 16:30:47

+0

@EmilioGaravaglia,我已經看到足夠的DeadMG答案,知道它的宗教信仰。 – Shahbaz 2012-07-29 16:31:53

+0

@Shahbaz:即使在考慮之前,也要評價其他人喜歡的票數! – 2012-07-29 16:46:35

1

我建議使用std::shared_ptr<SDL_Surface>SDL_FreeSurface作爲自定義刪除程序。

0

它取決於

如果您表面意爲擴展 SDL_Surface的,而且必須參加所有操作/功能SDL_Surface涉及到,你可能會想有一個方法來揭露「基本」元素。但

,而不是從一個類返回一個指針(的東西,在表達不同的間接級別),你可能有更好的返回引用或成本基準或兩個:

class Surface 
{ 
public: 
    operator SDL_Surface&() { return *surf_; } 
    operator const SDL_Surface&() const { return *surf_; } 
private: 
    SDL_Surface* surf_;  
} 

(注:避免C#-ish爪哇this->xxxx風格...)

如果您表面另一件,需要一個SDL_Surface一起工作,英美菸草公司的所有其他應用領域,比沒有隱式轉換s應該可用。

注意: 在上面的筆記我沒有做任何有關Surface和SDL_Surface生命週期或所有權的假設。 我只是假設兩個對象都存在,只要他們必須參與任何操作。誰創造並以何種順序銷燬它們,就是另一回事。 請注意,引用計數智能指針的使用並不能解決一般問題:除非您沒有定義所有權方向,否則由於循環引用的原因,忘記指向shared_ptr的指針只是一個很好的方法來使內存泄漏。 非常非常常見的錯誤,特別是來自Java程序員。

故事的道德:確定你想要對這些對象做什麼,在決定如何創建和刪除它們之前,使用「指針」來控制它們,以及如果啓用或不啓用隱式轉換以及哪個。

+0

更好的是,不要保留指針,而要保留一個對象:'SDL_Surface surf_;' – Shahbaz 2012-07-29 17:15:47

+1

如果您知道SDL,那麼您將知道這是不可能的。 – Puppy 2012-07-29 17:41:28

1

顯式是好的,隱式是壞的。

來自標準庫的示例:要將std::string轉換爲char const*,您必須致電c_str()。這可以幫助您避免在未注意到涉及轉換的情況下做出不聖潔的事情,並防止出現功能過載的令人驚訝的結果。

根據任何經驗法則,此規則都有例外。它不應該成爲思維的替代品。但通常,需要非常好的理由才能使轉換隱含起來。