【问题标题】:how to allocate memory foe generic class without having a T()如何在没有 T() 的情况下为泛型类分配内存
【发布时间】:2021-08-28 06:48:41
【问题描述】:

我有一个类,我想编写一个通用的排序列表,我们可以将它与该类一起使用:

class A
{
 int n;
 public:
  A(int n):n(n){}
};

这就是我想如何做我的排序列表类

template <class T>
class SortedList
 {
  T* data;
  int size;
  int max_size;
  void expand();
  static const int EXPAND_RATE=2;
  static const int INITIAL_SIZE=10;
public:
SortedList();
};
template <class T>
SortedList<T>::SortedList():data(new T[INITIAL_SIZE]),size(0),max_size(INITIAL_SIZE){}
//                                  ^^^ here we need a T() 

现在的问题是 A 类没有像这样的 c'tor A() 有没有人知道如何在不需要A() 的情况下编写 sortedlist 类??

PS:有些人建议用T datanext 做节点,但我看不出我该怎么做,这有什么帮助?因为我们仍然需要T()

编辑:我现在尝试这样做:

template <class T>
class SortedList
 {
  T** data;
// ^^
  int size;
  int max_size;
  void expand();
  static const int EXPAND_RATE=2;
  static const int INITIAL_SIZE=10;
public:
SortedList();
};
template <class T>
SortedList<T>::SortedList():data(new T*[INITIAL_SIZE]),size(0),max_size(INITIAL_SIZE){}

现在我遇到了这个函数的另一个问题:

void SortedList<T>::insert(const T& object)
{
 if(size>=max_size)
 {
     expand();
 }
 int index=0;
 for(int i=0;i<size;i++)
 {
  T item=*data[i];
// when I try to print item nothing goes out
  if(item<object)
//      ^^^ here I get a segmentation fault
  {
    continue;
  }
  index=i;
  break;
 }
 size++;
 for (int i = size-1; i >index; i--)
 {
  data[i]=data[i-1]; 
 }
 T Item(object);
 T* ptr= &Item;
 data[index]=ptr;
 //when I print *data[index] it does get printed perfectly
}

【问题讨论】:

  • 为什么不使用std::vector
  • 你想要一个列表还是一个数组/向量?
  • @Jarod42 这是不允许的
  • @Jarod42 我基本上想写一个通用列表,但不能使用任何 STL
  • 所以确实要使用 Node(您不必处理容量问题,这是有问题的东西)。

标签: c++ list class generics constructor


【解决方案1】:

有没有人知道如何在不需要 A() 的情况下编写 sortedlist 类??

  • 选项 1:分别为每个元素分配内存。换句话说,使用基于节点的数据结构,例如链表。

  • 选项 2:将内存分配与对象的创建分开。这可以通过使用std::allocator 分配内存和std::construct_at 创建对象来实现(在C++20 之前使用placement-new)。这就是std::vector等动态数组类数据结构的实现方式。

附:手动内存管理具有挑战性。如果您尝试在没有深入研究该主题的情况下这样做,您很可能会编写一个损坏的程序。

【讨论】:

  • 如果我使用一个节点应该是`struct node`还是类?数据字段应该是T data 还是T* data
  • @raghad 结构是类。你可以使用任何一个。使用struct 类键和class 类键之间的唯一区别是默认访问说明符。如果您在列表之外定义节点类,那么是的,它必须是一个模板。但是,如果您将其定义为列表模板中的嵌套类,则没有必要。单独分配数据比较浪费,推荐T
猜你喜欢
  • 2017-01-19
  • 2021-12-09
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2021-12-02
  • 2015-12-08
  • 2011-07-06
  • 2023-03-28
相关资源
最近更新 更多