微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不需要多个新运算符的情况下编写此代码?

如何解决如何在不需要多个新运算符的情况下编写此代码?

我有一个带有 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 举报,一经查实,本站将立刻删除。