C++ 向量设计难题
我不喜欢下面这样的类,它有一个IsValid()函数,因为您必须记住在任何地方都要检查IsValid():C++ 向量设计难题,c++,exception,constructor,throw,raii,C++,Exception,Constructor,Throw,Raii,我不喜欢下面这样的类,它有一个IsValid()函数,因为您必须记住在任何地方都要检查IsValid(): struct BadTextWidget { BadTextWidget(const std::string & TEXT) : m_text(TEXT) {} bool IsValid() const; ... 我更喜欢RAII方法,它使构建无效对象变得不可能: struct BetterTextWidget { BetterTextWidget
struct BadTextWidget
{
BadTextWidget(const std::string & TEXT) : m_text(TEXT) {}
bool IsValid() const;
...
我更喜欢RAII方法,它使构建无效对象变得不可能:
struct BetterTextWidget
{
BetterTextWidget(const std::string & TEXT) : m_text(TEXT)
{
if (IsValid(m_text) == false) throw std::invalid_argument("...");
}
...
不过,我也喜欢使用向量,但这需要构造函数参数具有无效的默认值。这迫使我再次使用BadTextWidget
那么,如何通过验证抛出的构造函数来获得std::vector的性能特征呢?如何解决这个设计难题?我缺少什么?直到c++11矢量元素需要可复制,因为c++11的要求取决于您使用的方法。一般来说,任何可移动的类都应该适用于大多数向量操作。如果不提供默认值,像resize()这样的操作仍然需要默认的可构造性 e、 g
std::vectorvector(20);
不起作用,但:
std::string str;
std::vector< BetterTextWidget > vector( 20, BetterTextWidget( str ) );
std::string str;
向量vector(20,BetterTextWidget(str));
将直到c++11矢量元素需要可复制,因为c++11的要求取决于您使用的方法。一般来说,任何可移动的类都应该适用于大多数向量操作。如果不提供默认值,像resize()这样的操作仍然需要默认的可构造性 e、 g
std::vectorvector(20);
不起作用,但:
std::string str;
std::vector< BetterTextWidget > vector( 20, BetterTextWidget( str ) );
std::string str;
向量vector(20,BetterTextWidget(str));
will
std::vector
不需要它所包含的项的默认构造函数“…但这要求构造函数参数具有无效的默认值。这迫使我再次使用BadTextWidget。”您可以对此进行扩展吗?这很不清楚是从哪里来的。您错误地认为,std::vector
需要默认构造函数参数,所以这可能就是您遇到这个难题的原因。std::vector
不需要它所持有的项的默认构造函数。".. 但这需要构造函数参数具有无效的默认值。这迫使我再次使用BadTextWidget。“你能对此进行扩展吗?它的来源相当不清楚。你做出了一个错误的假设,即std::vector
需要默认构造函数参数,所以可能这就是你遇到这个难题的原因。”。