0

C++ 新手在这里。我正在尝试仅使用指针编写自己的数组实现,但我碰壁了,我不知道如何克服。

我的构造函数抛出此错误

array.cpp:40:35: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]

当我的数组初始化时,我希望它为整数释放数组中的所有空间。

Array::Array(int theSize){
size = theSize;
int *arrayPointer = new int; 
int index = 0;
while(theSize > index){
  *(arrayPointer + index) = new int; //This is the trouble line.
  ++index;
 }
}

我在做什么错stackoverflow?

4

3 回答 3

1

arrayPointer指向单个int,它不指向 的数组int*,这行需要:

*(arrayPointer + index) = new int;

但类型*(arrayPointer + index)是 an int,因此编译器错误。

分配一个数组int

int* arrayPointer = new int[size];

如果这是为了初始化一个成员变量,那么:

arrayPointer = new int[size];

否则arrayPointer将是构造函数的本地。由于该类现在有一个动态分配的成员,因此您需要同时实现复制构造函数和赋值运算符或防止复制(请参阅什么是三法则?)。记得delete[] arrayPointer在析构函数中。


只是提到std::vector<int>,即使这是一个学习练习。

于 2012-08-29T21:33:08.720 回答
1

执行以下操作:

#include <cstddef>

template <typename T>
class Array
{

public:

    T* const arrayPointer; // arrayPointer can't be reallocated
    const size_t size; // size can't change

    Array(const int theSize) : arrayPointer(new T[theSize]),
                               size(theSize) {}

    ~Array() {
        delete[] arrayPointer;
    }

private:

    Array(const Array& other) {} // forbid copy

    Array& operator= (const Array& other) {} // forbid assignment

} ;
  • 为什么要使用template <typename T>?因此,您可以拥有任何类型的数组。
  • 为什么要使用new T[ theSize ]?所以你可以同时分配theSize元素。
  • 为什么要使用: arrayPointer( new T[ theSize ])?因此,如果分配失败(由于 theSize 太大),对象会在没有初始化的情况下失败。它被称为 RAII。
  • 为什么要使用delete [] arrayPointer?因为您使用new[]了并且必须释放整个数组。
  • 为什么是那些const?避免任何人更改数组的大小并使字段不一致。
  • 这些私有方法是什么?他们禁止复制,所以没有人可以制作array1 = array2; delete array2;,什么会释放array1的arrayPointer。

用法(它将分配 10 个 int 的数组:)

Array< int > arr( 10 ) ;

使用权:

arr.arrayPointer[ 0 ] = 5 ;

注意 - 您可以访问arrayPointer范围 0..9 的单元格。您可以添加operator[]到您的类以避免使用arrayPointer和使用arr[ 0 ].

于 2012-08-29T21:41:52.280 回答
0

您提到的那一行试图将 int* 设置为 int var => 取消引用 int* 提供 int :

*(arrayPointer + index) // is a int

无论如何,您正在您尚未保留的内存中移动(并取消引用内存)。因此,您可以通过执行此指令来访问受保护的内存区域。

将所有构造函数替换为:

Array::Array(int theSize)
{
    size = theSize;
    arrayPointer = new int[theSize]; // Replace your local var with a member one. Else you will lose your array ;)
}
于 2012-08-29T21:36:54.273 回答