C++ 如果使用非基元类型,清除泛型数组将引发逻辑错误
我有一个泛型数组类,如果与非原语类型一起使用,它会抛出一个C++ 如果使用非基元类型,清除泛型数组将引发逻辑错误,c++,templates,gcc,C++,Templates,Gcc,我有一个泛型数组类,如果与非原语类型一起使用,它会抛出一个logic\u错误 模板类: 引发的异常: 当调用::fill()时(/*1*/),这在数组中发生 我想用T类型的Null元素填充整个数组(如int为0或Nullif指针等)——而不迭代每个元素memset()在这里不是一个好的解决方案,不是吗?这里是您应该做的。这是具有正确类框架的最小代码 template<class T> class Array { T *m_elements; //declare a p
logic\u错误
模板类:
引发的异常:
当调用::fill()
时(/*1*/
),这在数组中发生
我想用T
类型的Null元素填充整个数组(如int为0或Null
if指针等)——而不迭代每个元素memset()
在这里不是一个好的解决方案,不是吗?这里是您应该做的。这是具有正确类框架的最小代码
template<class T>
class Array
{
T *m_elements; //declare a pointer member
size_t m_size; //count of the elements
public:
Array(size_t size) : m_size(size), m_element(new T[size]())
{ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// use member-initialization-list
}
~Array(); //must define it
Array(Array const & other); //must define it
Array& operator=(Array const & other); //must define it
Array(Array&& temporary); //better define it (in C++11)
Array& operator=(Array&& temporary); //better define it (in C++11)
//other
};
模板
类数组
{
T*m_元素;//声明指针成员
size\u t m\u size;//元素的计数
公众:
数组(size\u t size):m\u size(size),m\u元素(新的t[size]())
{ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//使用成员初始化列表
}
~Array();//必须定义它
数组(Array const&other);//必须定义它
数组和运算符=(数组常量和其他);//必须定义它
数组(Array&&temporary);//更好地定义它(在C++11中)
数组和运算符=(数组和临时);//更好地定义它(在C++11中)
//其他
};
要了解为什么必须定义析构函数、复制构造函数和复制赋值,更好地定义移动构造函数和移动赋值,请参见以下内容(按顺序):
以下是您应该做的事情。这是具有正确类框架的最小代码
template<class T>
class Array
{
T *m_elements; //declare a pointer member
size_t m_size; //count of the elements
public:
Array(size_t size) : m_size(size), m_element(new T[size]())
{ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// use member-initialization-list
}
~Array(); //must define it
Array(Array const & other); //must define it
Array& operator=(Array const & other); //must define it
Array(Array&& temporary); //better define it (in C++11)
Array& operator=(Array&& temporary); //better define it (in C++11)
//other
};
模板
类数组
{
T*m_元素;//声明指针成员
size\u t m\u size;//元素的计数
公众:
数组(size\u t size):m\u size(size),m\u元素(新的t[size]())
{ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//使用成员初始化列表
}
~Array();//必须定义它
数组(Array const&other);//必须定义它
数组和运算符=(数组常量和其他);//必须定义它
数组(Array&&temporary);//更好地定义它(在C++11中)
数组和运算符=(数组和临时);//更好地定义它(在C++11中)
//其他
};
要了解为什么必须定义析构函数、复制构造函数和复制赋值,更好地定义移动构造函数和移动赋值,请参见以下内容(按顺序):
什么是T元素[]
?这是不标准的。什么是this->elements[size]代码>应该怎么做?(看起来你来自Java!)不要用NULL初始化所有内容,用t()
初始化它std::string
在一个构造函数中接受一个char*
,因此它接受NULL
,但不会用空字符串初始化它。如果需要空字符串,请默认构造它。@Nawaz:catch!。我想创建一个具有构造函数长度的C++元素。Chris是正确的,您正在使用NULL
初始化值类型std::string
,这会引发异常。默认使用T()
构造对象。您还没有创建数组元素
,您必须使用新的T[size]
@ollo创建它,您可以得到类型决定的任何结果。对于像int
这样的东西,根据规范,这是0,但是如果您自己创建,您可以提供一个默认构造函数,并使默认构造的对象成为您想要的任何对象,或者如果没有其他构造函数,则使用为您提供的构造函数。对于std::string
,这是一个空字符串。对于std::vector
,一个空向量。什么是T元素[]
?这是不标准的。什么是this->elements[size]代码>应该怎么做?(看起来你来自Java!)不要用NULL初始化所有内容,用t()
初始化它std::string
在一个构造函数中接受一个char*
,因此它接受NULL
,但不会用空字符串初始化它。如果需要空字符串,请默认构造它。@Nawaz:catch!。我想创建一个具有构造函数长度的C++元素。Chris是正确的,您正在使用NULL
初始化值类型std::string
,这会引发异常。默认使用T()
构造对象。您还没有创建数组元素
,您必须使用新的T[size]
@ollo创建它,您可以得到类型决定的任何结果。对于像int
这样的东西,根据规范,这是0,但是如果您自己创建,您可以提供一个默认构造函数,并使默认构造的对象成为您想要的任何对象,或者如果没有其他构造函数,则使用为您提供的构造函数。对于std::string
,这是一个空字符串。对于std::vector
,一个空向量。谢谢<代码>:m_size(size),m_元素(新的T[size]())
是键:-)。顺便说一句,我已经定义了copyconstructor、操作符等,但在我的示例中没有定义。解决了我的问题,再次感谢@奥利奥:我仍然建议你阅读我提供的这个链接的主题。他们真的很好,理解这个概念很重要。@ollo:我很高兴知道这一点。:-)完成三件事的强制性规则后,切换到RAII:。它是C++中使用资源的现代方式,在使用时没有任何限制,使用起来很好。谢谢!代码>:m_size(size),m_元素(新的T[size]())
是键:-)。顺便说一句,我已经定义了copyconstructor、操作符等,但在我的示例中没有定义。解决了我的问题,再次感谢@奥利奥:我仍然建议你阅读我提供的这个链接的主题。他们真的很好,理解这个概念很重要。@ollo:我很高兴知道这一点。:-)完成三件事的强制性规则后,切换到RAII:。这是现代社会使用资源的方式
Array<string> arr(size); // <-- Exception thrown here
cout << arr.toString() << endl;
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
template<class T>
class Array
{
T *m_elements; //declare a pointer member
size_t m_size; //count of the elements
public:
Array(size_t size) : m_size(size), m_element(new T[size]())
{ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// use member-initialization-list
}
~Array(); //must define it
Array(Array const & other); //must define it
Array& operator=(Array const & other); //must define it
Array(Array&& temporary); //better define it (in C++11)
Array& operator=(Array&& temporary); //better define it (in C++11)
//other
};