Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量设计难题_C++_Exception_Constructor_Throw_Raii - Fatal编程技术网

C++ 向量设计难题

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

我不喜欢下面这样的类,它有一个IsValid()函数,因为您必须记住在任何地方都要检查IsValid():

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
需要默认构造函数参数,所以可能这就是你遇到这个难题的原因。”。