Универсальный класс для динамических массивов в c

#c #dynamic-memory-allocation

#c #динамическое выделение памяти

Вопрос:

Возможно ли создать универсальный класс, который действует как динамический массив объектов любого типа? Я хочу класс, который в основном делает это:

 MyObj * obj1 = new MyObj();
MutableArray * arr = new MutableArray();
arr->addObject(obj1);
MyObj * obj2 = arr->objectAtIndex(0);
// obj1 and obj2 now points to the same object
  

Вот как должен выглядеть код. Я знаю, что это не работает, но вы поняли идею.
Что мне нужно, так это некоторый универсальный тип для объекта. Сам массив просто состоит из указателей, поэтому размер объекта не должен иметь значения, верно?

Итак, возможно ли это?

.h-файл

 class MutableArray
{
    private:
        class * objs;
        int length;
        int capacity;

    public:
        MutableArray();
        void add(class * obj);
        class objectAtIndex(int index);
};
  

cpp-файл

 MutableArray::MutableArray()
{
    length = 0;
    capacity = 0;
}

void MutableArray::add(class * obj)
{
    if(length >= capacity)
    {
        this->enlarge();
    }
    objs[length] = obj;
    length  ;
}

void MutableArray::enlarge()
{
    int newCapacity = (capacity * 2) 1;
    class * newObjs = new class[newCapacity]

    if(capacity != 0)
    {
        delete [] objs;
    }

    objs = newObjs;
    capacity = newCapacity;
}

class MutableArray::objectAtIndex(int index)
{
    return objs[index];
}
  

Комментарии:

1. Вы рассматривали std::vector ?

2. Добро пожаловать в C

Ответ №1:

Это уже было изобретено и называется std::vector<> .

Комментарии:

1. О, здорово: D Я часами читал о динамических массивах, и ни в одном примере это не упоминалось … странно! Спасибо

Ответ №2:

Возможно ли создать универсальный класс, который действует как динамический массив объектов любого типа?

Для динамического массива используйте std::vector , для объектов любого типа используйте boost::any .

 std::vector< boost::any > anything;
  

Комментарии:

1. Судя по вопросу, похоже, что он даже не запрашивает, чтобы массив содержал объекты разных типов во время выполнения, поэтому std::vector его типа должен делать.

2. @Rob K: Он спрашивает об объектах любого типа и пытается реализовать его как class * obj (возможно, указатель на любой класс?). Так что, я думаю, он делает.

Ответ №3:

Вы хотите использовать STL std::vector .

Ответ №4:

ДА. Он действительно существует и вызывается std::vector .