Вы в основном ограничены (*sampleVertex.some2DTable)(0,0)
. Конечно, если вам не нужно пересматривать, почему бы не сохранить вместо этого фактические значения в матрице?
В качестве альтернативы, сделайте указатель приватным и сделайте метод доступа (примечание: в следующих примерах предполагается матрица EntryTypes):
Matrix& Vertex::GetTableRef()
{
return *some2DTable;
}
// or
Matrix::EntryType& Vertex::GetTableEntry(int row, int col)
{
return (*some2DTable)(row,col);
}
// way later...
myVertex.GetTableRef()(0,0) = 0;
// or...
myVertex.GetTableEntry(0,0) = 0;
Или просто определите встроенную функцию, чтобы сделать это для вас, если вы не можете изменить класс Vertex:
// in some header file
inline Matrix& GetTableRef(Vertex& v)
{
return *v.some2DTable;
}
// or you could do this
inline Matrix::EntryType& GetTableEntry(Vertex& v, int row, int col)
{
return (*v.some2DTable)(row, col);
}
// later...
GetTableRef(myVertex)(0, 0) = 0;
// or
GetTableEntry(myVertex, 0, 0) = 0;
Наконец, не забывайте, что у вас нет для использования перегрузки операторов. Коллекции STL реализуют функцию-член at (), которая проверяется, в отличие от оператора [], который не проверяется. Если вы не возражаете против накладных расходов, связанных с проверкой границ, или если вы просто хотите быть нестандартными, вы можете реализовать at (), а затем просто вызвать myVertex.some2DTable->at(0,0)
, что полностью избавит вас от синтаксической головной боли.