Declarar el tamaño de la matriz de un objeto en la clase
Frecuentes
Visto 2,298 veces
1
Recibo "Error de segmentación" cuando intento completar mi matriz. Así que pensé en declarar el tamaño de las matrices en la clase para declarar el tamaño de la matriz para que pueda asignar el espacio, pero lo recibo.
error: uso no válido del miembro de datos no estáticos 'Array::Size' error: desde esta ubicación
//Current
class Array{
public:
int Size;
int Range;
int Array[];
};
//Problematic
class Array{
public:
int Size;
int Range;
int Array[Size];
};
o hay algún otro método para prevenir una falla de segmentación?
3 Respuestas
3
Está intentando usar un lenguaje C, donde el último miembro de una estructura es una matriz muy corta (uno o, si el compilador lo permite como una extensión no estándar, cero elementos) y se asigna memoria adicional para la estructura para que los elementos más allá se puede acceder al final de la matriz declarada. Este fue originalmente un truco no estándar, conocido como el truco de estructura, o en algunos compiladores como matrices de longitud cero. Fue estandarizado en C99 como matrices flexibles.
Cuando usó este idioma, necesitaba asignar memoria adicional para la matriz, por ejemplo sizeof (struct Array) + sizeof (int) * number_of_elements
. De lo contrario, no tendría memoria asignada para más elementos de los que realmente declaró (generalmente uno o cero), y obtendría un comportamiento indefinido cuando intentara acceder a elementos más allá de eso.
Sin embargo, está escribiendo C++, no C99. Incluso si su compilador le permite hacer esto, confiar en él sería una práctica muy mala y mucho más incómodo en C++ que en C.
Almacene un puntero en la clase y asigne la cantidad adecuada de memoria en el constructor, y desasígnelo en el destructor, o use una clase C ++ que administrará la memoria por usted, por ejemplo std::vector
.
Aquí hay un ejemplo de uso std::vector
:
#include <vector>
class Array{
public:
int size;
int range;
std::vector<int> array;
Array(int size, int range) :
size( size ),
range( range ),
array( size, 0 )
{
}
};
contestado el 23 de mayo de 17 a las 13:05
1
Ambas definiciones
//Current
class Array{
public:
int Size;
int Range;
int Array[];
};
//Problematic
class Array{
public:
int Size;
int Range;
int Array[Size];
};
no son válidos. El primero no es válido porque es posible que la definición de clase no contenga miembros de datos no estáticos incompletos. No puede escribir int Array[]; El segundo no es válido porque 1) el tamaño del miembro de datos tiene un valor indefinido y 2) el tamaño de una matriz debe ser una expresión constante. En lugar de declarar una matriz, puede usar un puntero y asignar dinámicamente una matriz del tamaño requerido.
respondido 29 nov., 13:11
1
Puedes usar el puntero.
class Array{
public:
int Size;
int Range;
int* Array;
};
En el constructor, puede asignarle memoria. O tal vez puedas hacerlo en una función miembro.
Array::Array(/*parameters*/){
/* code */
Array = new int [Size] //After Size is initialized or assigned.
}
En el destructor, debes usar delete[] Array
para desasignar la memoria.
Respondido el 01 de diciembre de 13 a las 07:12
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ arrays class segmentation-fault or haz tu propia pregunta.
@Constantin No,
int Array[];
no es una forma válida de declarar unint*
. Su código no parece compilar para mí. Ver aquí. - svkSe llama "matriz flexible" en C99. "Longitud cero" sería algo así como
int a[0]
, que nunca fue estándar y solo está disponible como una extensión en ciertos compiladores. - Kerrek SB@KerrekSB Trató de aclarar, ¿mejor? Pre-C99, tengo entendido que el truco no era estándar pero aún se usaba de forma generalizada, aunque tal vez como
int a[1]
más bien queint a[0]
. - svk@svk: Entonces,
int a[1]
en realidad sería estándar, aunque la asignación y el acceso a más memoria no lo eran (en C89), pero siempre tendría que lidiar con el molesto apagado por uno. Yo creoint a[0]
(¡estrictamente como un miembro de la estructura!)int a[]
en C99... - Kerrek SB@KerrekSB Bueno, claro,
int a[1]
siempre fue estándar como una declaración de una matriz de un solo elemento, pero eso parece un tecnicismo si a uno nunca se le permitió accedera[1]
después de asignar algo de memoria adicional. - svk