Несмотря на проблемы проектирования / использования в вашем коде, наиболее очевидная проблема заключается в том, что вы хотите поместить определение класса в файл functs.h
вместо файла functs.cpp
:
functs.h
:
// This is declaration is highly not recommended for use in header files.
// using namespace std;
#ifndef FUNCTS_H_INCLUDED
#define FUNCTS_H_INCLUDED
#include <string>
class ArrayList{
public:
void add(int num);
void add(int num, int index);
void remove(int index);
void removeNum(int num);
std::string toString();
ArrayList(int init);
private:
void resize();
int size, cap;
int *myList[10];
};
#endif // FUNCTS_H_INCLUDED
functs.cpp
:
#include "functs.h"
void ArrayList::add(int num){
if (size>=cap/2)
{
resize();
}
*myList[size] = num;
size++;
}
void ArrayList::resize(){
int temp[cap*2];
int i;
for (i = 0; i < size; i++)
{
temp[i] = *myList[i];
}
*myList = temp;
}
ArrayList::ArrayList(){
size = 0;
cap = 10;
}
void ArrayList::add(int num, int index){
int temp = *myList[index];
int i;
for (i = index; i < size; i++)
{
*myList[index] = num;
num = temp;
temp = *myList[i+1];
}
add(temp);
}
std::string ArrayList::toString(){
std::string returnString = "{";
int i;
for (i = 0; i < size; i++)
returnString.append(*myList[i] +",");
returnString.replace(returnString.length()-1,1,"}");
return returnString;
}
templatetypedef указывает причину, по которой это необходимо.В основном, компилятор должен знать, сколько места нужно ArrayList
, а class ArrayList;
не предоставляет такой информации.
Не рекомендуется объявлять using namespace std;
в заголовочном файле, потому чтотогда каждый, у кого есть файл functs.h
(включая ваших клиентов!), также будет иметь using namespace std;
, что увеличивает вероятность конфликтов имен.
Я настоятельно рекомендую вам подобрать aхорошая вводная книга по C ++ , если вы хотите изучать C ++ правильно.Вы демонстрируете в своем вопросе довольно большое непонимание того, как хорошо написан C ++.Это не значит, что вы некомпетентны как человек, но есть некоторые серьезные проблемы с кодом, который вы представляете.Просто перечислим несколько:
- Стандартный C ++ уже предоставляет совершенно прекрасный класс массива под названием
std::vector
.Нет необходимости изобретать велосипед для того, что вы делаете.И даже если вам нужно заново изобрести колесо, глубокое понимание C ++ и большой опыт работы с C ++ являются необходимым условием для реализации контейнера массива, подходящего для производственного использования. - Открытый интерфейс вашего класса неполон.Клиенты не могут узнать, сколько элементов на самом деле находится в массиве.
int *myList[10];
объявляет массив fixed из 10 указателей на int
.Это не подходит для класса массива.Особенно, если вы хотите, чтобы размер массива изменялся. - Недостаточно управления памятью, чтобы этот класс был полезен в любом смысле.Деструкторов нет, и, по-видимому, конструкторы не являются полными (и не совпадают), поэтому у вас нет реального логического места для размещения таких вещей, как
new[]
и delete[]
. - У вас есть
ArrayList *al = new ArrayList;
, ноу вас нигде нет соответствующего delete al;
.Это утечка памяти. - Но последний момент - спорный вопрос, потому что вы должны использовать
ArrayList a1;
вместо ArrayList *al = new ArrayList;
.Первый автоматически «удалит» себя в конце области (в данном случае, функции main()
), в то время как последний требует оператора delete
.C ++ не похож на Java, где автоматически собираются неиспользованные new
'ed объекты.
Я не могу комментировать правильность используемых вами алгоритмов, потому что (и я извиняюсь за этопотому что это будет звучать резко) то, что у вас есть, просто не сработает.Опять же, я рекомендую вам взять хорошую вводную книгу по С ++ , в которой будут рассмотрены такие вопросы.(Я должен подчеркнуть, что ни один из этих недостатков не является заявлением о вас как о личности. Я говорю конкретно о коде, который у вас есть в вашем вопросе.)