У меня есть класс для разбора матрицы, которая хранит результат в элементе массива:
class Parser
{
...
double matrix_[4][4];
};
Пользователь этого класса должен вызвать функцию API (например, функцию, которую я не могу контролировать, поэтому я не могу просто изменить ее интерфейс, чтобы сделать работу более простой), которая выглядит следующим образом:
void api_func(const double matrix[4][4]);
Единственный способ, которым я придумала, чтобы вызывающая сторона передавала результат массива функции, это сделав элемент public:
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
Это единственный способ сделать что-то? Я поражен тем, насколько жесткими объявлены многомерные массивы. Я думал, что matrix_
по сути будет таким же, как double**
, и я мог (безопасно) разыграть между ними. Оказывается, я даже не могу найти небезопасный способ разыгрывания между вещами. Скажем, я добавляю аксессор к классу Parser
:
void* Parser::getMatrix()
{
return (void*)matrix_;
}
Это скомпилируется, но я не могу его использовать, потому что, похоже, нет способа привести обратно к типу массива weirdo:
// A smorgasbord of syntax errors...
api_func((double[][])parser.getMatrix());
api_func((double[4][4])parser.getMatrix());
api_func((double**)parser.getMatrix()); // cast works but it's to the wrong type
Ошибка:
ошибка C2440: «приведение типа»: невозможно преобразовать из «void *» в «const double [4] [4] '
... с интригующим дополнением:
Нет преобразований в типы массивов, хотя есть преобразования в ссылки или указатели на массивы
Я не могу определить, как привести к ссылке или указателю на массив, хотя это, вероятно, мне здесь не поможет.
Конечно, на данный момент дело носит чисто академический характер, поскольку void*
броски едва ли чище, чем один ученик оставил публику!