我应该使用转换操作符来转换结构吗?

问题描述:

我在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

这是一个非常糟糕的主意。 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

我建议使用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程序员。

故事的道德:确定你想要对这些对象做什么,在决定如何创建和删除它们之前,使用“指针”来控制它们,以及如果启用或不启用隐式转换以及哪个。

+0

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

+1

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

显式是好的,隐式是坏的。

来自标准库的示例:要将std::string转换为char const*,您必须致电c_str()。这可以帮助您避免在未注意到涉及转换的情况下做出不圣洁的事情,并防止出现功能过载的令人惊讶的结果。

根据任何经验法则,此规则都有例外。它不应该成为思维的替代品。但通常,需要非常好的理由才能使转换隐含起来。