我想要一个模板类包含两个模板动态数组作为成员变量。我还使用一个成员函数来为它们赋值。但是我的代码有问题,我不知道原因(可能是语法)。下面的代码有什么问题?
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)中复制数组到他们那里最有效?
最佳答案
ArrayHolderHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
^^^^^^^^^^^^^^^^^
这是一个错字。类名是ArrayHolder
,而不是ArrayHolder
。此外,您没有编写返回类型。
因为你不能传递数组(按值),最好在参数列表中使用指针符号函数,并且因为它是类模板,更喜欢在类本身中定义函数:
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);
}
最后一个实现是一个惯用的解决方案,是库实现者的首选。
关于c++ - 动态模板数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366505/