Как всегда при использовании указателей вы должны будете убедиться, что вы действительно обращаетесь к действительной ячейке памяти ations.
Вы также можете удалить одну косвенную связь за счет небольшого увеличения накладных расходов на индекс. 2D-массив, также может быть представлена в виде массива 1D, которые могут быть доступны, как это:
my_class_object.GetArr()[i * height + j]
В этом случае предложение Матса Петерсона использовать std::vector
из std::vector
ы могут быть сведены к одному вектору:
const std::vector<int>& ClassName::GetArr() const // assuming read-only access
{
return arr;
}
Независимо от того, что вы делаете, использование оператора индекса также может инициировать нарушение доступа, поскольку оно по сути имеет тот же эффект, что и доступ к C-массиву, указывающий на недопустимое хранилище.
Легко защитить себя от этого, однако:
size_t index = i * height + j;
const std::vector<int>& vec = my_class_object.GetArr();
if(index < vec.size())
{
// do stuff using the value at the calculated index
}
EDIT: Просто, чтобы избавить вас путаницы, индексы я и J должны быть в [0, ВЫСОТА (и [0, ШИРИНА (соответственно, где высота и ширина являются размерами массива по y и x.
Будьте в безопасности и используйте вектор. – 0x499602D2
@ 0x499602D2: Согласовано, но в этом случае OP захочет вектор векторов. ;) – thokra
убедитесь, что arr является «новым», а не адресом локальной переменной или массивом – texasbruce