构造函数参数的条件
Conditions on a constructors arguments
是否可以检查构造函数的参数是否存在某些约束,如果不满足这些约束,则不会创建对象并返回一个值来告知创建失败。
例如。
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 返回(或你选择执行的任何操作来指示它失败(。
这是一个简单而常见的解决方案,但您可以用类似的想法编造其他人。
- 如果条件,当我想第二个参数时
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 用于根据条件选择编译时类型的可变参数模板
- 我可以有条件地使用多个参数吗?
- 在解压缩可变参数模板时避免"recursive"函数调用,直到运行时条件
- 使用 std::条件根据模板参数选择成员类型
- 具有条件的C 模板非类型参数
- 如何避免参数数量依赖于条件的调用分支?
- 有条件的操作员从其参数的副本中返回值
- 根据模板参数条件 C++17 创建成员别名
- 当条件为真时,有没有办法连接宏参数
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 参数大小可变的函数:如何有条件地设置一些参数?
- 根据数值模板参数有条件地编译转换运算符
- 如果参数条件为 true,则阻止执行返回函数
- 在哪些条件下,我们将指针作为函数参数
- 基于模板类型参数的条件成员签名和实现
- 有条件地将基类引用参数视为派生类并将其返回
- c++预处理器条件参数