【问题标题】:C++ deleteting object in constructor?C ++在构造函数中删除对象?
【发布时间】:2021-04-12 02:36:26
【问题描述】:

我想创建一个有一个字符串属性的类。但是如果字符串的长度超过 50 个字符,我不想创建对象。我该怎么办?

{
    if (paSlovo.length() <= DLZKA_SLOVA)
        aSlovo = paSlovo;
    else
        delete this;
    
} ```

【问题讨论】:

  • 中止构造函数的唯一方法是从中抛出异常。
  • 这真的是一个类的属性,还是您的使用场景的属性,在这种情况下,您应该在尝试创建对象之前进行检查。至于构造函数,你总是可以抛出异常。
  • delete this 在构造函数中将导致对象的任何使用(谁的构造已结束)具有未定义的行为。改为抛出异常 - 调用者的最终效果是对象从未存在过。

标签: c++ string object constructor question-answering


【解决方案1】:

您可以使用一个函数来执行此操作,而不是通过构造函数执行此操作,该函数将在满足条件时为您提供对象,或者您得到一个 nullptr。

确保在完成后正确删除对象或使用智能指针

//create object
bar* TryCreateMyObj(string const& paSlovo) const
{
    //only create object if string is less than 50
    if (paSlovo.length() <= DLZKA_SLOVA)
    {
        return new bar();
    }
    return nullptr
}

【讨论】:

  • 最好更改该功能以分发std::unique_ptr&lt;bar&gt;std::optonal&lt;bar&gt; 是返回类型的另一个不错的选择。
  • @πάνταῥεῖ 你们中的任何一个人会建议将此函数作为返回类型的类级函数(即static bar::)或请求对象的方法,还是全局非方法函数?
  • @Vroomfondel 耸耸肩
  • @Vroomfondel 取决于您的使用/结构。如果需要,可以在类中将其设为静态函数并隐藏/ = 删除默认构造函数。通过这种方式,您可以让其他用户使用该功能。
猜你喜欢
  • 2018-10-11
  • 2019-10-08
  • 2015-01-30
  • 1970-01-01
  • 2011-02-20
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多