Когда я объявляю объект «Уровень» в определении класса «LevelEditor» таким образом, все работает нормально:
class LevelEditor
{
public:
LevelEditor(int w, int h, Shader* shader)
{
width = w;
height = h;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
tile[x][y] = new WorldSprite(tileWidth * x, tileHeight * y, tileWidth, tileHeight, shader);
}
}
}
//...
private:
//...
Level level = Level(50, 50);
WorldSprite* tile[300][300];
//tile characteristics
int tileWidth = 50;
int tileHeight = 50;
//flags
bool editing = true;
};
Но когда я объявляю объект «Уровень» в конструкторе «LevelEditor» таким образом, я получаю переполнение стека:
class LevelEditor
{
public:
LevelEditor(int w, int h, Shader* shader)
{
width = w;
height = h;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
tile[x][y] = new WorldSprite(tileWidth * x, tileHeight * y, tileWidth, tileHeight, shader);
}
}
//NOTE: width and height both equal 50
level = Level(width, height);
}
//...
private:
//...
Level level;
WorldSprite* tile[300][300];
//tile characteristics
int tileWidth = 50;
int tileHeight = 50;
//flags
bool editing = true;
};
Это заставляет меня задаться вопросом, в чем разница между объявлением переменной в определении класса и в конструкторе, помимо факта времени определения переменной. Любая идея о том, что может быть причиной? и как я могу объявить объект «Уровень» в конструкторе, не помещая ничего в кучу?
РЕДАКТИРОВАТЬ: определение класса «Уровень», если это полезно:
class Level
{
public:
Level(int w, int h)
{
Worldwidth = w;
Worldheight = h;
for (unsigned int y = 0; y < Worldheight; y++)
{
for (unsigned int x = 0; x < Worldwidth; x++)
{
grid[x][y] = -1;
}
}
}
Level(){}
~Level()
{
for (auto it = tiles.begin(); it != tiles.end(); ++it)
{
delete *it;
}
tiles.clear();
for (auto it = entities.begin(); it != entities.end(); ++it)
{
delete *it;
}
entities.clear();
}
void draw()
{
}
private:
int Worldwidth;
int Worldheight;
int grid[300][300];
std::vector<Tile*> tiles;
std::vector<Entity*> entities;
};
LevelEditor
объектов. Пересмотрите свой дизайн. Вы объявляете отдельные объекты размером более 300 КБ. - person PaulMcKenzie   schedule 20.03.2015Level
не будет безопасно скопирован из-за того, что ваш класс использует указатели (вектор указателей) в качестве членов. Для этого требуется пользовательский конструктор копирования и оператор присваивания, так как значения по умолчанию не подходят. Ваш деструктор дляLevel
удаляет все выделенные экземпляры в векторе, поэтомуlevel = Level(...)
оставляетlevel
с фиктивными значениями. Я предлагаю вам использовать векторы и, возможно,std::shared_ptr
вместо необработанных указателей. - person PaulMcKenzie   schedule 20.03.2015array
, которого нет в куче, и именно массив занимает все это пространство. - person PaulMcKenzie   schedule 20.03.2015