tengo una clase para analizar una matriz que mantiene el resultado en un miembro de la matriz:¿Cómo lidiar con matrices (declaradas en la pila) en C++?
class Parser
{
...
double matrix_[4][4];
};
El usuario de esta clase necesita llamar a una función API (como en, una función que no tengo control sobre, por lo no puedo cambiar su interfaz para que las cosas funcionen más fácilmente) que tiene este aspecto:
void api_func(const double matrix[4][4]);
la única manera que he llegado con la persona que llama pasar el resultado matriz a la función está haciendo el miembro público:
void myfunc()
{
Parser parser;
...
api_func(parser.matrix_);
}
¿Es esta la única manera de hacer las cosas? Estoy asombrado de cómo las matrices multidimensionales inflexibles declaradas así son. Pensé que matrix_
sería esencialmente lo mismo que double**
y que podría lanzar (con seguridad) entre los dos. Resulta que ni siquiera puedo encontrar insegura forma de lanzar entre las cosas. Digamos que añadir un descriptor de acceso a la clase Parser
:
void* Parser::getMatrix()
{
return (void*)matrix_;
}
Esto compilará, pero no puedo usarlo, porque no parece ser una forma de emitir de nuevo al tipo de matriz raro:
// 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
El error es: C2440
error: 'tipo fundido': no se puede convertir de 'void *' a 'const doble [4] [4]'
... con una adición intrigante:
No hay conversiones a tipos de matriz, aunque hay conversiones a referencias o punteros a las matrices de
no puedo determinar cómo lanzar a una referencia o puntero a la matriz tampoco, aunque probablemente no me ayude aquí.
Sin duda, en este punto el asunto es puramente académico, ya que los modelos void*
son apenas más limpios que un solo miembro de la clase que se deja en libertad.
Dale un golpe. :-) – Andrew
porque usé un nombre de tipo más corto. Piensa en todo el tiempo que desperdiciaste escribiendo esos cinco caracteres extra ... ;-p – Shog9
Y expandió el "// ..." s también ... Sin embargo, creo que debería aceptar el primero. Lo siento Andrew! – Owen