我应该使用转换操作符来转换结构吗?
我在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