gpt4 book ai didi

c++ - 如果使用非原始类型,清除泛型数组会抛出 logic_error

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:59 24 4
gpt4 key购买 nike

我有一个通用数组类,如果它与非原始类型一起使用,它会抛出一个 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

这发生在 Array 类中,当 ::fill_() 被调用时 (/* 1 */)。

我想用 T 类型的 Null-Element 填充整个数组(如 0 if int 或 NULL if pointer 等) - 而不是迭代每个元素。 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++ - 如果使用非原始类型,清除泛型数组会抛出 logic_error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com