构造函数参数的条件

Conditions on a constructors arguments

本文关键字:条件 参数 构造函数      更新时间:2023-10-16

是否可以检查构造函数的参数是否存在某些约束,如果不满足这些约束,则不会创建对象并返回一个值来告知创建失败。

例如。

Class Device
{
   string id;
   Device(string ID)
   {
          If (ID.Length != 7)
          {
              //Do not create Object
          }
    id == ID;
   }
}

在这里我只想要 7 个字符长的 id 字符串,不少于而不是更多! 如果不是 7 个字符,我不想创建对象,可以这样做吗?

除了外部功能检查之外,我想不出任何解决方案,这是我想远离的!

通常的方法是检查条件,如果不满足,则引发异常。

另一种可能性是接受 7 个字符的数组,因此如果传递其他内容,代码将不会编译。不过,这往往更难很好地工作(例如,如果有人传递错误类型的对象,即使是实际包含 7 个字符的字符串之类的对象,它通常不起作用(。

一种中间点是创建一个专门用于保存 7 个字符字符串的类型,如果长度错误,则在其 ctor 中抛出异常。这可以提供更多的粒度,以便在引发异常时更容易知道出了什么问题,并确保如果向 Device 对象传递有效的 DeviceName(或你喜欢的任何名称(对象,创建该对象将成功。

您可以引发异常。https://stackoverflow.com/a/7894215/2887128

Class Device
{
   string id;
   Device(string ID)
   {
          If (ID.Length != 7)
          {
              throw invalidObjectParametersException;
          }
    id == ID;
   }
}

您还可以在某种工厂中调整设计和包装结构。

我能想到的一种选择是不满足条件时抛出错误,并在创建对象的函数中捕获该错误。

是的,您可以实现一个有效的方法,如果创建的对象有效,它将返回。为此,在不创建真实对象的情况下,您必须创建一个内部结构,该结构将成为 owner 类的私有成员:

Class Device
{
   struct DeviceImplementation {
      string id;
      Device owner;
      DeviceImplementation (Device *owner, const string &id):
        owner(owner),
        id(id)
      {
      }
   };
   std::unique_ptr<DeviceImplementation> implementation;
public:
   Device(const string &ID)
   {
          If (ID.Length != 7)
          {
              //Do not create Object
          } else
            implementation=std::unique_ptr<DeviceImplementation>(new DeviceImplementation(this, ID));
   }
   bool isValid() const {return implementation!=nullptr;}
}

不,构造函数只能返回对象(或引发异常(。

如果您希望有机会验证参数或上下文,则应进行:

a( 构造函数私有(因此不能再从类外部调用它(

b( 提供一个返回对象的静态公共方法(或者,例如,如果失败,则返回 NULL(,并在此方法中进行测试,如果成功,则调用私有构造函数并返回创建的对象。

当然,外部代码需要能够处理 NULL 返回(或你选择执行的任何操作来指示它失败(。

这是一个简单而常见的解决方案,但您可以用类似的想法编造其他人。