构造函数参数的条件

时间:2016-01-05 17:24:20

标签: c++ c++11

是否可以检查构造函数的参数是否存在某些约束,如果它们未被满足,则不会创建该对象并返回一个值以告知它无法创建。

例如

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

}

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

除了外部功能检查之外我无法想到任何解决方案,这是我想要远离的东西!

5 个答案:

答案 0 :(得分:6)

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

另一种可能性是接受一个包含7个字符的数组,因此如果传递了其他内容,代码将无法编译。一般来说,这通常会变得更加棘手(例如,如果某人传递了错误类型的对象,甚至像字符串实际上包含7个字符的话,它通常会工作)。

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

答案 1 :(得分:2)

您可以抛出异常。 https://stackoverflow.com/a/7894215/2887128

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

}

你也可以在某种工厂调整你的设计和包装结构。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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;}
}

答案 4 :(得分:-1)

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

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

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

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

当然,外部代码需要能够处理NULL返回(或者你选择做什么来表示失败)。

这是一个简单而通用的解决方案,但你可以用其他类似的想法来弥补其他人。