我正在C ++类中包装一个与该结构相关的结构和函数。
class Surface
{
public:
operator SDL_Surface* () { return this->surf_; } // good idea?
private:
SDL_Surface* surf_;
}
在这种情况下使用转换运算符是个好主意吗?或者我会遇到问题?任何替代方案?
答案 0 :(得分:4)
这是一个非常糟糕的主意。 SDL_Surface*
应该完全封装在类中,只能访问属于SDL抽象的其他类。此外,你应该聪明地指出它,以确保它的安全销毁。
答案 1 :(得分:1)
我建议将std::shared_ptr<SDL_Surface>
与SDL_FreeSurface
一起用作自定义删除工具。
答案 2 :(得分:1)
明确是好的,暗示是坏的。
标准库中的示例:要将std::string
转换为char const*
,您必须致电c_str()
。这样可以避免您在不注意转换的情况下执行邪恶事物,并且可以防止功能过载导致意外结果。
根据任何经验法则,这条规则都有例外。它不应该是思考的替代品。但一般来说,需要非常好的理由来隐含转换。
答案 3 :(得分: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 Javanese this->xxxx
样式......)
如果你的Surface 只是另一件事,那么需要使用SDL_Surface,bat拥有所有其他应用程序域,而不是隐式转换应该可用。
注意:强>
在上面的注释中,我没有对Surface和SDL_Surface的生命周期或所有权做任何假设。
我只是假设两个对象都存在,只要他们必须参与任何操作。谁创造并摧毁了他们的秩序和时间,是另一个故事。
请注意,引用计数智能指针的使用并不能解决一般问题:在没有定义所有权方向之前,忘记指向shared_ptr
的指针只是因为循环而导致内存泄漏的好方法参考。
这是一个非常常见的错误,特别是来自Java程序员。
故事的道德:确定你想要对这些对象做什么,然后决定如何创建和删除它们,使用“指针”的女王来保存它们以及是否启用隐式转换以及哪些。 / p>