C++ 在c+中强制执行空检查+;
我的方法可以返回某种类型的指针(例如boost::shared_ptr),该指针可能为空。有没有办法强制我的代码的用户检查代码是否为空C++ 在c+中强制执行空检查+;,c++,pointers,boost,C++,Pointers,Boost,我的方法可以返回某种类型的指针(例如boost::shared_ptr),该指针可能为空。有没有办法强制我的代码的用户检查代码是否为空 例如,scals的Option容器可能是boost的boost::Option?您可以执行以下操作: 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常 抛出异常而不是返回空指针 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”) 您可以执行以下操作: 返回一个智能指针类型,该类型在
例如,scals的Option容器可能是boost的boost::Option?您可以执行以下操作:
- 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常
- 抛出异常而不是返回空指针
- 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”)
- 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常
- 抛出异常而不是返回空指针
- 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”)
- 这里的现实是,函数的调用方已经必须进行检查。如果他们试图在不检查的情况下访问共享指针,那么如果底层指针为空,则会出现seg错误
您不需要指定是在编写库还是在项目中编写某些代码。您也没有指定此代码所处环境的任何细节——所有这些都可能决定我在这种情况下将采用哪种方法——但从广义上讲,utnapistim的所有建议都是好的 实际情况是,函数的调用者已经需要检查了。如果他们试图在不检查的情况下访问共享指针,那么如果底层指针为空,则会出现seg错误
您不需要指定是在编写库还是在项目中编写某些代码。您也没有指定此代码所处环境的任何细节——所有这些都可能决定我在这种情况下将采用哪种方法——但从广义上讲,utnapistim的所有建议都是好的 通常的解决方案是将返回值包装在一个类中 包含一个标记,该标记在选中或删除指针时设置 已复制,如果未设置标志,其析构函数将崩溃。 比如:
template <typename T>
class MustBeChecked
{
T* myValue;
mutable bool myHasBeenChecked;
public:
MustBeChecked( T* value )
: myValue( value )
, myHasBeenChecked( false )
{
}
MustBeChecked( MustBeChecked const& other )
: myValue( other.myValue )
, myHasBeenChecked( false )
{
other.myHasBeenChecked = true;
}
~MustBeChecked()
{
assert( myHasBeenChecked );
}
bool operator==( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue == nullptr;
}
bool operator!=( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue != nullptr;
}
operator T*() const
{
assert( myHasBeenChecked );
return myValue;
}
};
模板
必须检查班级
{
T*myValue;
已检查可变布尔值;
公众:
必须检查(T*值)
:myValue(值)
,Myhasbeen已检查(假)
{
}
必须检查(必须检查常数和其他)
:myValue(other.myValue)
,Myhasbeen已检查(假)
{
other.myHasBeenChecked=true;
}
~MustBeChecked()
{
断言(myHasBeenChecked);
}
布尔运算符==(nullptr_t)常量
{
myHasBeenChecked=true;
返回myValue==nullptr;
}
布尔运算符!=(nullptr\t)常量
{
myHasBeenChecked=true;
返回myValue!=nullptr;
}
算子T*()常数
{
断言(myHasBeenChecked);
返回myValue;
}
};
坦率地说,我发现这在大多数情况下都是矫枉过正的。但我已经
可以在一些关键系统上使用它。通常的解决方案是将返回值包装在一个类中,这样 包含一个标记,该标记在选中或删除指针时设置 已复制,如果未设置标志,其析构函数将崩溃。 比如:
template <typename T>
class MustBeChecked
{
T* myValue;
mutable bool myHasBeenChecked;
public:
MustBeChecked( T* value )
: myValue( value )
, myHasBeenChecked( false )
{
}
MustBeChecked( MustBeChecked const& other )
: myValue( other.myValue )
, myHasBeenChecked( false )
{
other.myHasBeenChecked = true;
}
~MustBeChecked()
{
assert( myHasBeenChecked );
}
bool operator==( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue == nullptr;
}
bool operator!=( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue != nullptr;
}
operator T*() const
{
assert( myHasBeenChecked );
return myValue;
}
};
模板
必须检查班级
{
T*myValue;
已检查可变布尔值;
公众:
必须检查(T*值)
:myValue(值)
,Myhasbeen已检查(假)
{
}
必须检查(必须检查常数和其他)
:myValue(other.myValue)
,Myhasbeen已检查(假)
{
other.myHasBeenChecked=true;
}
~MustBeChecked()
{
断言(myHasBeenChecked);
}
布尔运算符==(nullptr_t)常量
{
myHasBeenChecked=true;
返回myValue==nullptr;
}
布尔运算符!=(nullptr\t)常量
{
myHasBeenChecked=true;
返回myValue!=nullptr;
}
算子T*()常数
{
断言(myHasBeenChecked);
返回myValue;
}
};
坦率地说,我发现这在大多数情况下都是矫枉过正的。但我已经
看到它在一些关键系统上使用过。为什么您希望用户在返回共享\u ptr之前检查post条件而不是检查post条件?您不能强制检查返回类型是否为
NULL
。一些编译器提供的最多的功能是警告未使用的函数结果。异常可能更合适吗?“强制我的代码的用户进行检查”-如果检查失败怎么办?为什么要用户检查而不是在返回共享\u ptr之前检查post条件?不能强制检查返回类型是否为NULL
。一些编译器提供的最多的功能是警告未使用的函数结果。异常可能更合适吗?“强制我的代码的用户进行检查”-如果检查失败怎么办?前两个解决方案并没有真正解决这个问题。据推测,在某些情况下,函数应该返回空指针;客户必须进行测试,并在这种情况下采取不同的行为。在异常情况下也可以这样做,但是如果在调用函数中立即进行检查,则会使事情变得特别麻烦。前两种解决方案并没有真正解决这个问题。据推测,在某些情况下,函数应该返回空指针;客户必须进行测试,并在这种情况下采取不同的行为。可以在异常情况下执行此操作,但如果在调用函数中立即进行检查,则会使事情变得特别麻烦。