我在C++類中封裝了一個與該結構相關的結構和函數。我應該使用轉換操作符來轉換結構嗎?
class Surface
{
public:
operator SDL_Surface*() { return this->surf_; } // good idea?
private:
SDL_Surface* surf_;
}
在這種情況下使用轉換運算符是個好主意嗎?或者我會遇到問題?任何替代品?
我在C++類中封裝了一個與該結構相關的結構和函數。我應該使用轉換操作符來轉換結構嗎?
class Surface
{
public:
operator SDL_Surface*() { return this->surf_; } // good idea?
private:
SDL_Surface* surf_;
}
在這種情況下使用轉換運算符是個好主意嗎?或者我會遇到問題?任何替代品?
這是一個非常糟糕的主意。 SDL_Surface*
應該完全封裝在類中,只有屬於SDL抽象的其他類才能訪問。另外,你應該聰明地指向它以確保它的安全銷燬。
AMEN! (這是一個C++的答案或只是宗教?) – 2012-07-29 16:30:47
@EmilioGaravaglia,我已經看到足夠的DeadMG答案,知道它的宗教信仰。 – Shahbaz 2012-07-29 16:31:53
@Shahbaz:即使在考慮之前,也要評價其他人喜歡的票數! – 2012-07-29 16:46:35
我建議使用std::shared_ptr<SDL_Surface>
和SDL_FreeSurface
作爲自定義刪除程序。
它取決於。
如果您表面意爲擴展 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程序員。
故事的道德:確定你想要對這些對象做什麼,在決定如何創建和刪除它們之前,使用「指針」來控制它們,以及如果啓用或不啓用隱式轉換以及哪個。
顯式是好的,隱式是壞的。
來自標準庫的示例:要將std::string
轉換爲char const*
,您必須致電c_str()
。這可以幫助您避免在未注意到涉及轉換的情況下做出不聖潔的事情,並防止出現功能過載的令人驚訝的結果。
根據任何經驗法則,此規則都有例外。它不應該成爲思維的替代品。但通常,需要非常好的理由才能使轉換隱含起來。
我之前就做過這樣的事情,它已經成功了,但你可能不想這樣做,直到你找到一個真實的用例。 – 2012-07-29 16:22:24
另一種選擇是具有合適名稱的成員。 'std :: string :: c_str'和'std :: unique_ptr :: get'就是這樣的成員的例子。 –
2012-07-29 16:29:56