c++ push_back правильно ли написал?

264
13 октября 2021, 16:40
#include <iostream>
#include <string>
using namespace std;
#define RETURN return 0
class Dinamic
{
    public:
        Dinamic()
        {
            cout<<"Constructor\t"<<this<<endl;
            size=1;
            arr = new int[size];
        }
        Dinamic(const Dinamic& FromCopy)
        {
        }
        ~Dinamic()
        {
            delete[]arr;
        }
        //methods
        void push_back(const int& value)
        {
            int* NewArr = new int[(this->size+1)];
            for(int i = 0; i < (this->size+1);i++)
            {
                NewArr[i]=this->arr[i];
            }
            NewArr[size]=value;
            size++;
            delete[]arr;
            arr=NewArr;
        }
        void PrintArray()
        {
            for(int i = 1; i < size; i++) 
            {
                cout<<arr[i]<<"\t";
            }
            cout<<endl;
        }
    private:
    int* arr;
    int size;
};
int main() 
{
    Dinamic l;  
    l.push_back(8);
    l.push_back(8);
    l.PrintArray();
    RETURN;
}

у меня все работает хорошо, но в arr[0] где то присваивается 0. Поэтому я пишу в PrintArray int i = 1. Я не могу понять ГДЕ ПРИСВАИВАЕТСЯ 0? помогите пожалуйста)

PrintArray: int i = 0

Answer 1

Проблема в том, что Вы не используете элемент с индексом 0.

  1. При создании объекта размер массива должен быть 0, а не 1, как у Вас установлено в конструкторе.
  2. В конструкторе указатель на массив инициализируйте null.
  3. При добавлении элемента проверяйте: если указатель на массив равен null, создавайте массив из одного элемента и кладите туда добавляемый элемент. Если не null - так, как у Вас уже сделано, кроме условия цикла. Должно быть

    j < this->size

Answer 2

Если коротко - заменить в конструкторе на

size=0;
arr = 0;

У вас сразу есть 1 элемент в массиве (вот этот 0) и вы его тащите до конца.

Важно, в коде будет вызван delete[] на null массив. Насколько я знаю, это безопасно.

READ ALSO
перегрузка operator+ c++

перегрузка operator+ c++

я написал перегрузку оператора+ для класса Dinamic:

203
Управление SVG подключенного через img

Управление SVG подключенного через img

Можно ли, с помощью JS, как-то управлять стилями, атрибутами svg, который подключен через тег img ?

136
Создание кнопок [закрыт]

Создание кнопок [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

69