Здравствуйте!
Делаю я сейчас абстрактный класс «таблица». Эта таблица состоит из объектов - «ячеек». В момент создания объекта «таблица» известно количество ячеек по горизонтали и вертикали.
В процессе работы я нашел неплохое описание, как делать многомерные динамические массивы. «C++. Бархатный путь. Часть 1. Страница 76. Многомерные динамические массивы.» http://www.cyberguru.ru/programming/cpp/cpp-velvet-way-page76.html
По аналогии делаю и свой класс. Заголовок
class EditorAbsTable
{
public:
EditorAbsTable(int x, int y, QString table_text);
~EditorAbsTable(void);
private:
void create_cells_array(int x, int y);
void delete_cells_array(void);
void clear_table(void);
int columns;
int rows;
EditorAbsTableCell **cells; // Ячейки таблицы
};
Реализация
// Конструктор
EditorAbsTable::EditorAbsTable(int x, int y, QString table_text)
{
create_cells_array(x,y);
clear_table();
convert_table_to_internal(table_text);
}
// Деструктор
EditorAbsTable::~EditorAbsTable(void)
{
delete_cells_array();
}
// Выделение памяти под двумерный массив таблицы
void EditorAbsTable::create_cells_array(int x, int y)
{
cells=new EditorAbsTableCell*[x];
for(int i=0;i<x;i++)
cells[i]=new EditorAbsTableCell[y];
}
// Удаление памяти, отведенной под двумерный массив таблицы
void EditorAbsTable::delete_cells_array(void)
{
for(int i=0;i<columns;i++)
delete []cells[i];
delete []cells;
}
// Очистка таблицы
void EditorAbsTable::clear_table(void)
{
for(int i=0;i<columns;i++)
for(int j=0;j<rows;j++)
cells[i][j].clear();
}
Проблема в том, что возникает сегфолт в методе clear_table(). Сегфолт возникает при вызове cells[j].clear() когда i становится равным 1. (Пока i=0 а j=0..n, вызов cells[j].clear() срабатывает нормально). То есть, обрабатывается только один столбец.
Я так подозреваю, что сегфолт происходит из-за того, что по указанным координатам, начиная с cells[1...x][...] ссылок на объекты-ячейки просто нет, так как они не были созданы в методе create_cells_array(). Поэтому не может вызваться метод clear() для соответсвующей ячейки.
Но вот смотрю я на код метода create_cells_array(), и не пойму, как же его переделать так, чтобы и память для каждой ячейки выделилась, и конструктор для каждой ячейки сработал.
Как это сделать?