如果使用非基本类型,清除泛型数组将抛出logic_error
Clearing generic array throws logic_error if non-primitive type is used
我有一个泛型数组类,如果它与非基本类型一起使用,则抛出logic_error
。
模板类:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
#define NULL_ELEMENT ((T)NULL)
template<class T> class Array
{
public:
Array(const int size)
{
this->elements[size];
this->size = size;
::fill_n(elements, size, NULL_ELEMENT); /* 1 */
}
// Output of the array
string toString()
{
int i=0;
stringstream ss;
ss << "Array{ ";
for( ; i<size-1; i++ )
{
ss << elements[i] << ", ";
}
ss << elements[i] << " }";
return ss.str();
}
// ...
private:
int size;
T elements[];
};
测试代码:
工作(使用原始类型):
Array<int> arr(5);
cout << arr.toString() << endl;
数组被0
: Array{ 0, 0, 0, 0, 0 }
填充
失败(使用非基本类型):
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
当::fill_()
被调用(/* 1 */
)时,这种情况发生在Array
类中。
我想用T
类型的null元素填充整个数组(如0如果int或NULL
如果指针等)-不迭代每个元素。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
};
要知道为什么必须定义析构函数、复制构造函数和复制赋值函数, 最好定义移动构造函数和移动赋值函数,参见这些(按顺序):
- 什么是"三原则"?
- 规则三变成规则五在c++ 11?
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '