C ++ newb here。我正在尝试仅使用指针编写自己的数组实现,而且我已经碰壁了,我不知道如何克服。
我的构造函数抛出此错误
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?
答案 0 :(得分:1)
arrayPointer
指向一个int
,它不指向int*
的数组,此行需要:
*(arrayPointer + index) = new int;
但*(arrayPointer + index)
的类型是int
,因此编译错误。
分配int
:
int* arrayPointer = new int[size];
如果这是为了初始化成员变量,那么:
arrayPointer = new int[size];
否则arrayPointer
将是构造函数的本地。由于该类现在具有动态分配的成员,因此您需要实现复制构造函数和赋值运算符,或者防止复制(请参阅What is The Rule of Three?)。请记住析构函数中的delete[] arrayPointer
。
只要提及std::vector<int>
,即使这是一次学习练习。
答案 1 :(得分: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 ;
注意 - 您可以在范围0..9的单元格中访问arrayPointer
。您可以在班级中添加operator[]
,以避免使用arrayPointer
并使用arr[ 0 ]
。
答案 2 :(得分:0)
您提到的那一行是尝试将int *设置为int var =&gt;取消引用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 ;)
}