В один прекрасный день я решил создать класс в C++ с возможностями хранения, подобными возможностям хранения NSMutableArray в объекте c (я знаю, что векторы - это тип данных goto для такого рода вещей, но я все равно сделал свой собственный). Поэтому я сделал класс mutableArray в C++, и до сих пор он отлично работает. Я могу добавлять и удалять объекты, вставлять их в определенный индекс, если хочу, без указания размера моего массива.C++ изменяемый массив различных типов данных?
Так что моя проблема: до сих пор она может хранить объекты типа int. Есть ли способ сделать это, чтобы он сохранял другие типы данных без необходимости создания целого нового класса для этого конкретного типа? Я не заинтересован в том, чтобы хранить объекты разных типов данных в одном и том же mutableArray, я просто хочу указать, какой тип данных имеет мой mutableArray.
Мой заголовочный файл:
#define MUTABLEARRAY_H
class mutableArray
{
public:
mutableArray();
virtual ~mutableArray();
void initWithSize(int length);
void initWithArrayThroughIndeces(int nums[], int minimum, int maximum);
void addObject(int number);
void insertObjectAtIndex(int number, int index);
void changeSize(int length);
void removeLastObject();
void removeObjectAtIndex(int index);
int objectAtIndex(int index);
int lastObject();
int firstObject();
int countObjects();
protected:
private:
int *start;
int amount;
};
#endif // MUTABLEARRAY_H
мой каст файл:
#include "mutableArray.h"
mutableArray::mutableArray()
{
//ctor
start = new int;
amount = 0;
}
mutableArray::~mutableArray()
{
//dtor
}
void mutableArray::initWithSize(int length){
amount = length;
}
void mutableArray::initWithArrayThroughIndeces(int nums[], int minimum, int maximum){
amount = maximum - minimum;
start = nums + minimum;
}
void mutableArray::addObject(int number){
amount++;
start[amount] = number;
}
void mutableArray::insertObjectAtIndex(int number, int index){
amount++;
int j = 0;
for (int *i = start + amount; i > start; i--){
if (j >= index){
start[j + 1] = *i;
}
j++;
}
start[index] = number;
}
void mutableArray::removeLastObject(){
amount--;
}
void mutableArray::removeObjectAtIndex(int index){
amount--;
int j = 0;
for (int *i = start; i < start + amount; i++){
if (j != index){
start[j] = *i;
j++;
}
}
}
int mutableArray::objectAtIndex(int index){
return start[index];
}
int mutableArray::lastObject(){
return start[amount];
}
int mutableArray::firstObject(){
return *start;
}
int mutableArray::countObjects(){
return amount;
}
Так оно и есть. Любая помощь будет высоко ценится.
Да, это шаблон (например, 'std :: vector', который вы упомянули). Предупреждение: код шаблона не может быть разделен на файлы .h/.cpp, такие как не-шаблонный код. Таким образом, вам придется либо переместить код в .cpp обратно в .h, либо включить .cpp в .h (внизу). Вы не нарушите ODR (одно правило определения), потому что шаблоны являются локальными для TU (единица перевода). Вы можете легко найти дополнительную информацию об этом на SO. – Borgleader
Вы хотите, чтобы один экземпляр массива мог хранить объекты разных типов? – juanchopanza