如何解决如何在不需要多个新运算符的情况下编写此代码?
我有一个带有 template <class T>
的通用代码,我希望它在不需要 T()
的情况下工作
所以对于复制构造函数,我有这个:
template <class T>
SortedList<T>::SortedList(const SortedList<T>& list):
data(new T*[list.max_size]),size(list.size),max_size(list.max_size)
{
for (int i = 0; i < size; i++)
{
T* new_element=new T(*(list.data[i]));//my problem
data[i]=new_element;
}
}
它工作正常,我没有任何 valgrind 错误或任何类型的错误
但是我了解到在您的代码中包含多个 new
并不是好的编码,所以我想编写一个没有 new
的代码
所以我试过这个:
T* new_element=& T(*(list.data[i]));
有人知道我现在应该做什么吗?
解决方法
如果你这样做:
template <class T>
SortedList<T>::SortedList(const SortedList<T>& list):
data(new T*[list.max_size]),size(list.size),max_size(list.max_size)
{
for (int i = 0; i < size; i++)
{
T* new_element=new T(*(list.data[i]));
data[i]=new_element;
}
}
您正在复制另一个 SortedList<T>
的所有元素。我不确定你是从哪里听到的:
我了解到在您的代码中包含多个新代码并不是好的编码。
远离动态分配并使用预编码容器是一种很好的做法。从 SortedList
的声音来看,我会说你想要一个 std::set
。
如果您的容器可以使用其他容器的元素,您可以这样做:
template <class T>
SortedList<T>::SortedList(const SortedList<T>& list):
data(new T*[list.max_size]),max_size(list.max_size)
{
for (int i = 0; i < size; i++)
{
T* new_element= list.data[i];
data[i]=new_element;
}
}
这可能造成一些问题,因为如果您修改第一个 SortedList<T>
的元素,它会修改第二个的元素,因此您可能不想这样做。 >
你不能这样做的原因:
T* new_element=& T(*(list.data[i]));
是因为 *list.data[i]
是一个临时变量,一旦退出 for
循环的当前迭代,它就会被破坏。如果你获取它的地址,一旦你尝试修改它,你就会得到一个错误,因为该元素不再存在。 (它已被破坏。)我建议您暂时保持代码不变,或者最好使用不同的容器。
这个问题的另一个答案建议使用这个:
std::memcpy(data,list.data,list.size * sizeof(T))
问题在于,正如@AndyG 所说:
遇到这样的事情一定要非常小心。它只适用于普通的可重定位类型,不适用于泛型 T。
另一个答案也建议做std::copy
。这可能适用于您的目的,因为它是更高级别的,并且在幕后使用 new
完成所有工作。要使用它,您可以这样做:
std::copy(list.data[0],list.data[list.size-1],data[0]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。