#c
#c
Вопрос:
Я новичок в C , и мне нужно создать шаблонный класс, который реализует список массивов. Для этого нужна куча функций-членов, которые, я совершенно уверен, у меня правильные, но я не уверен в конструкторе копирования и операторе присваивания.
Я часами смотрел на этот код и не могу понять, почему он не будет выводиться правильно.
Мой вывод: [0,1,2,0,0,]
Желаемый результат: [0,1,2,3,4,]
Я думаю, что это как-то связано с моим оператором присваивания и конструктором копирования, но я не могу понять это.
#include <iostream>
#include <cstring>
using namespace std;
template <typename Item>
class ArrayList {
private:
Item *Array;
size_t arrayLength; // length of array
size_t listSize; // # elements in array
public:
ArrayList(size_t asize=10) {
// Set up array
// Initialize parameters
Array = new Item[asize 1];
arrayLength = asize;
listSize = 0;
}
~ArrayList()
{
delete [] Array;
}
ArrayList(const ArrayList amp;other)
{
arrayLength = other.arrayLength;
listSize = other.listSize;
Array = new Item[arrayLength 1];
memcpy(Array, other.Array, arrayLength 1);
}
ArrayListamp; operator= (const ArrayList amp;other)
{
arrayLength = other.arrayLength;
listSize = other.listSize;
Array = new Item[arrayLength 1];
memcpy(Array, other.Array, arrayLength 1);
return *this;
}
bool needToResize(){
return arrayLength == listSize;
}
void resize(){
Item *temp = new Item[arrayLength * 2];
for(size_t i = 0; i < arrayLength; i ){
temp[i] = Array[i];
}
Array = temp;
arrayLength *= 2;
}
void insertAt(Item a, size_t index = 0)
{
if(needToResize()){
resize();
}
for(size_t i = listSize; i > index; i--){
// index = 3
// Item = 6
// 0 1 2 3 4 5 6 7 8 9 10
// eggs eggs ___
Array[i] = Array[i - 1];
}
Array[index] = a;
listSize ;
}
Itemamp; at(size_t index){
return Array[index];
}
void remove(size_t index)
{
for(size_t i = index; i < arrayLength; i ){
Array[i] = Array[i 1];
}
listSize--;
}
bool empty() {
return listSize == 0;
}
size_t find(Item item)
{
size_t i = 0;
for(i = 0; i < arrayLength; i ){
if(Array[i] == item){
return i;
}
}
return i;
}
size_t size()
{
return listSize;
}
};
// DO NOT MODIFY BELOW HERE
template <typename T>
ostreamamp; operator<< (ostreamamp; out, ArrayList<T> amp;array)
{
out << "[";
for (size_t i=0; i<array.size(); i )
{
out << array.at(i) << ",";
}
out << "]";
return out;
}
int main()
{
ArrayList<int> l;
for (int i=0; i<5; i )
l.insertAt(i,l.size());
ArrayList<int> l2 = l;
cout << l2 << endl;
return 0;
}
Комментарии:
1.
memcpy
копирует байты, ваше содержимое — этоint
s, которые обычно не по одному байту каждый. Это может легко привести к тому, что что-то пойдет не так. Также почему 1s?2. Удалите 1 везде. В memcpy вам нужно написать arrayLength * sizeof Item
3. Как указывали другие, при копировании необходимо учитывать размер элементов. Однако, хотя это будет работать для простых типов, таких как int, вы не можете использовать объекты memcpy, потому что у них могут быть пользовательские операторы присваивания и конструкторы копирования, которые необходимо использовать для создания действительной копии.
4.
memcpy(Array, other.Array, arrayLength 1);
— использоватьstd::copy
, а неmemcpy
. Например, ваш класс с треском провалится, если выArrayList<std::string>
это сделаете.