我应该使用转换运算符来构建我要包含的结构吗?

时间:2012-07-29 16:16:34

标签: c++ oop type-conversion operator-overloading

我正在C ++类中包装一个与该结构相关的结构和函数。

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

在这种情况下使用转换运算符是个好主意吗?或者我会遇到问题?任何替代方案?

4 个答案:

答案 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>