Есть ли команда, чтобы проверить, являются ли объекты в моем динамическом массиве динамическими или статическими? - PullRequest
0 голосов
/ 25 октября 2019

Я сделал динамический массив с шаблоном. Проблема в том, что когда я не держу там указатели (например: Tab<string> da;), мой деструктор не должен очищать его и выдает ошибку, вызванную delete arr[i];. Мой вопрос заключается в том, могу ли я поставить условие if (в котором я бы поставил clear() метод), которое сообщило бы мне, если мой массив содержит указатели. В простейшем случае я могу использовать clear() в основном, когда держу там указатели, но мой учитель хочет, чтобы я сделал это так, как я написал выше.

Я пытался использовать is_pointer, но это не работаетили я использую это неправильно. Какие-либо предложения?

#ifndef TABLICA_H
#define TABLICA_H

#include <iostream>
#include <type_traits>

using namespace std;

template<class T>
class Tab
{
public:

int size = 0;
int max_size = 1;
T* arr;
bool isDynamic = false;


Tab()
{
    arr = new T[max_size];
}

~Tab()
{
    clear();
    delete[] arr;
}


void check_size()
{
    if (size == max_size)
    {
        max_size = max_size * 2;
        T* arr2 = new T[max_size];
        for (int i = 0; i < size; i++)
        {
            arr2[i] = arr[i];
        }
        delete[] arr;
        arr = arr2;
    }
}

void push_back(const T& value)
{
    check_size();
    arr[size] = value;
    size++;
}

T return_by_index(int index)
{
    if (index<0 || index > size)
    {
        return NULL;
    }
    return arr[index];
}

bool replace(int index, const T& value)
{
    if (index<0 || index > size)
    {
        return false;
    }
    arr[index] = value;
    return true;
}

void print(int number)
{
    cout << "Rozmiar obecny: " << size << endl;
    cout << "Rozmiar maksymalny: " << max_size << endl;
    cout << "Adres tablicy: " << arr << endl;
    cout << "Kilka poczatkowych elementow tablicy " << "(" << number << ")" << endl;
    for (int i = 0; i < number; i++)
    {
        cout << *arr[i] << endl;
    }
}

void clear()
{
    for (int i = 0; i < size; i++)
    {
        delete arr[i];
    }
}

};

#endif 


//Source:

#include <iostream>

struct object
{
int field1;
char field2;

object()
{
    field1 = rand() % 10001;
    field2 = rand() % 26 + 'A';
}

};

ostream& operator<<(ostream& out, const object& o)
{
return out << o.field1 << " " << o.field2;
}

int main()
{

Tab < object* >* da = new Tab < object* >();
delete da;
system("PAUSE");
return 0;
...