Grid::Grid(int xPos, int yPos) {
squares = new squares[xPos][yPos];
//Trying to make squares into a 2D array, and turn the values into the arguments
//into the the x,y coordinates
}
Это, конечно, неправильно. Вы должны сделать new int[xPos][yPos]
. Оператор требует, чтобы вы указали его тип. Но все же тогда вы еще не закончили. yPos
должно быть известно во время компиляции. В вашем примере это не так. Причина в том, что он становится частью типа, возвращаемого новым выражением:
int (*squares)[yPos] = new int[xPos][yPos];
Поскольку типы являются статическими, yPos не могут быть определены во время выполнения. То, что вы действительно хотите, это вектор int. Но я полагаю, что вы хотите сами управлять памятью, потому что хотите выучить языковые правила. Так что иди с этим:
- Сделать квадраты
int*
: int *squares;
- Измените строку в конструкторе на
squares = new int[xPos * yPos];
- Добавьте строку типа
delete[] squares;
в свой деструктор.
- Добавьте конструктор копирования и оператор копирования, который копирует по вашей памяти, когда копируется ваш экземпляр.
- добавить функцию-член, подобную приведенной ниже:
Код:
int & get(int x, int y) { return squares[y * yPos + x]; }
Который даст вам целое число в данной позиции. Конечно, вы также можете перегружать operator[]
, чтобы иметь естественный доступ, используя 2d индексы:
class Grid {
struct proxy {
proxy(int *row):row(row) { }
int & operator[](int x) {
return row[x];
}
int * row;
};
int * squares;
public:
proxy operator[](int y) {
return proxy(squares + yPos * y);
}
};
Внешний индекс выберет строку, внутренний - столбец. Если вам нужно правильно управлять памятью, вы можете перейти к лучшим решениям. Для вашей задачи идеально подходит boost::multi_array
: Boost.MultiArray
Другие проблемы
Никогда не делайте using namespace std;
в заголовочном файле. Причина в том, что во весь код, который косвенно или напрямую включает этот файл, также будет автоматически включена эта строка, и поэтому он будет видеть весь std :: Конфликты имен произойдут, как только код попытается сослаться на имена, которые также определены в стандартной библиотеке C ++.