我希望模板类包含两个模板动态数组作为成员变量。我还使用成员函数为它们赋值。但是我遇到了代码问题,我不知道原因(可能是语法)。以下代码有什么问题?
template<typename T>
class ArrayHolder
{
public:
ArrayHolder();
void setArrays( T [], T [],int,int);
private:
T *array1;
T *array2;
};
template<typename T>
ArrayHolderHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
{
array1 = new T[N1];
array2 = new T[N2];
}
在setArrays中初始化动态数组之后,将数组从参数(firstarray,secondarray)复制到它们最有效的是什么?
答案 0 :(得分:3)
ArrayHolderHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
^^^^^^^^^^^^^^^^^
这是一个错字。班级名称为ArrayHolder
,而非ArrayHolderHolder
。此外,您没有编写返回类型。
由于你不能传递数组(按值),最好在参数列表中使用指针符号函数,因为它是类模板,所以更喜欢在类本身中定义函数:
template<typename T>
class ArrayHolder
{
public:
ArrayHolder();
void setArrays(T *firstarray,T *secondarray ,int N1, int N2)
{
array1 = new T[N1];
array2 = new T[N2];
//if you want to copy, then use `std::copy` as:
std::copy(firstarray, firstarray + N1, array1);
std::copy(secondarray, secondarray + N2, array2);
}
private:
T *array1;
T *array2;
};
顺便说一下,您可以使用st::vector
代替原始数组:
std::vector<T> array1;
std::vector<T> array2;
同样在setArrays
的参数列表中也是如此。如果您这样做,那么setArray
将成为:
void setArrays(const std::vector<T> & first, const std::vector<T> & second)
{
//maybe you need to do this!
array1.clear();
array2.clear();
array1.insert(array1.end(), first.begin(), first.end());
array2.insert(array2.end(), second.begin(), second.end());
}
简单,不是吗?没有内存分配,没有释放!
或者甚至更好,如果您按值接受参数,那么您可以写下:
void setArrays(std::vector<T> first, std::vector<T> second)
{
//no need to clear!
array1.swap(first);
array2.swap(second);
}
最后一个实现是一个惯用的解决方案,是库实现者的首选。
答案 1 :(得分:1)
除了@Nawaz回答:你在setArrays()定义之前忘记了void
返回类型。
答案 2 :(得分:0)
std :: copy是最有效的方法。 http://www.cplusplus.com/reference/algorithm/copy/
std::copy(firstarray, firstarray + N1, array1);
std::copy(secondarray, secondarray + N2, array2);
当然,这只是在你坚持使用数组时。我个人总是使用标准模板库中的容器。在这种情况下,我会使用std :: vector但每个都使用它们。