如果使用非基本类型,清除泛型数组将抛出logic_error

Clearing generic array throws logic_error if non-primitive type is used

本文关键字:数组 logic error 泛型 清除 类型 如果      更新时间:2023-10-16

我有一个泛型数组类,如果它与非基本类型一起使用,则抛出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?