【问题标题】:How to create our own dynamic array class in c++如何在 C++ 中创建我们自己的动态数组类
【发布时间】:2021-12-27 04:01:08
【问题描述】:

我试图创建自己的数组类(类似于 std::vector)只是为了好玩,但有一些问题...... Array 类代码本身可以工作并成功编译,但如果我尝试实例化 Array 类的对象,则会引发错误。

#include<iostream>

template<typename type, int size>
class Array
{
 private:
 type _mArray[size] = new type[size];
 public:
 int Access(int index)
 {
  return _mArray[index];
 }
 int Len()
 {
   return size;
 }
 void Insert(int index, type val)
 {
  _mArray[index] = val;
 }
 ~Array()
 {
  delete[] _mArray; 
 }
};//All code above compiles successfully

int main()
{
  Array<int, 2> name; //this line throws an error
}

我对 C++ 有点陌生,所以如果有人能解释一下,我将非常感谢....

顺便说一句,这是错误 数组初始化器必须是初始化器列表

【问题讨论】:

  • 如果你想要一个像 std::vector 这样的动态数组,不要将 size 作为模板参数。大小的类型也不应该是 int 而是 std::size_t (避免必须检查索引
  • Array 类代码本身起作用 -- int main() { Array&lt;int, 2&gt; name; Array&lt;int, 2&gt; name2; name = name2; } -- 运行时双重删除错误。你今天仍有工作要让这段代码真正有用。
  • 看起来更像std::array(固定大小的数组)而不是std::vector(动态大小的数组)。

标签: c++ arrays


【解决方案1】:
type _mArray[size] = new type[size];

模板实例化为:typeintsize 为 2。因此,变为:

int _mArray[2] = new int[2];

这显然没有多大意义。如果您将其逐字记录在您的 main() 中,您的 C++ 编译器也会为您提供同样的投诉。

很明显,这里的意图很简单:

type _mArray[size];

没有别的了。

附:现在,让我们回过头来重读一下痛苦的 C++ 编译器在这里努力沟通的内容:

数组初始化器必须是初始化器列表

int _mArray[2] 显然是一个数组。后面有一个=。好的,这一定是数组初始化。如何在 C++ 中初始化数组?当然,使用大括号初始化列表。这将是这样的,例如:

int _mArray[2]={1, 2};

C++ 编译器没有看到这种情况,并试图告诉你。

【讨论】:

  • 很好的解释+1
  • 必须修复/删除析构函数 :-)
【解决方案2】:
#include<iostream>

template<typename type, int size>
class Array
{
 private:
 type * _mArray ;
 public:
 int Access(int index)
 {
  return _mArray[index];
 }
 int Len()
 {
   return size;
 }

 Array()
 {
   _mArray = new type[size];
 }
 ~Array()
 {
  delete[] _mArray; 
 }
 int& operator[](int index){
    return _mArray[index];
 }
};//All code above compiles successfully

int main()
{
  Array<int, 2> name; 
  name[0] = 1024;
  name[1] = 100;

  for(int i= 0; i< name.Len(); i++)
  {
     std::cout<< name[i] << std::endl;
  }

}

【讨论】:

【解决方案3】:

您可以使用以下最小更改来构建它:

@@ -4,7 +4,7 @@ template<typename type, int size>
 class Array
 {
  private:
- type _mArray[size] = new type[size];
+ type* _mArray;
  public:
  int Access(int index)
  {
@@ -18,6 +18,10 @@ class Array
  {
   _mArray[index] = val;
  }
+ Array()
+ {
+  _mArray = new type[size]; 
+ }
  ~Array()
  {
   delete[] _mArray; 

基本上,您应该在构造函数中初始化数组,并将指向它的指针存储为类成员。以下代码构建:

#include<iostream>

template<typename type, int size>
class Array
{
 private:
 type* _mArray;
 public:
 int Access(int index)
 {
  return _mArray[index];
 }
 int Len()
 {
   return size;
 }
 void Insert(int index, type val)
 {
  _mArray[index] = val;
 }
 Array()
 {
  _mArray = new type[size]; 
 }
 ~Array()
 {
  delete[] _mArray; 
 }
};//All code above compiles successfully

int main()
{
  Array<int, 2> name; //this line throws an error
}

【讨论】:

猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2011-03-15
  • 2021-01-12
  • 2011-06-09
相关资源
最近更新 更多