¿Tengo problemas para asignar una matriz?

Tengo problemas con este fragmento de código y no sé cómo hacerlo funcionar. No puedo entender cuál es el problema, ya que para mí parece que debería funcionar. La matriz de cadenas llamada m_nameList en ambos lugares está marcada como 'Una referencia de objeto requerida para el campo, método o propiedad no estáticos 'Solutionname.classname.m_nameList'

el código:

    public static bool CheckVacantSeats(int seatNumber)
    {            
        if (m_nameList[seatNumber] == null)
      {
          return true;
      }
      return false;
    }

m_nameList es una matriz que se declara en un constructor antes de este bool estático:

     public SeatManager(int maxNumberOfSeats)
    {
        m_totNumOfSeats = maxNumberOfSeats;
        m_nameList = new string[m_totNumOfSeats];
        m_priceList = new double[m_totNumOfSeats];
    }   

Estoy llamando a CheckVacantSeat desde otra clase con esto:

  bool validSeats = SeatManager.CheckVacantSeats(seatNumber, m_nameList);    

No puedo entender qué tiene de malo. Entonces, necesito ayuda para averiguar por qué m_nameList no funciona para mí.

¡¡Gracias por adelantado!!

//Saludos

preguntado el 27 de julio de 12 a las 17:07

Error estándar: reescribir if (x) return true; else return false; a return x;siempre. -

4 Respuestas

El problema es que has marcado tu método como estático. Dado que es estático, tiene un estado "no" y no puede acceder a los miembros de la clase que no están marcados como estáticos.

Puede marcar m_nameList como estático, pero eso significa que su valor se comparte entre todas las lecturas y escrituras. m_nameList parece una tabla de búsqueda simple, ¿quizás esto es lo que quieres?

La lectura recomendada es estático y Clases estáticas y miembros estáticos.

Respondido 27 Jul 12, 17:07

Exactamente, ¿cómo sabría a qué instancia de un miembro acceder? - NegroVegetal

(ayuda con una palabra mejor) ¿Lee y escribe? - NegroVegetal

Su función es estática, pero sus variables no son estáticas.

Respondido 27 Jul 12, 17:07

Bueno, tu llamada está mal para empezar, tu método CheckVacantSeats solo acepta un parámetro, por lo que no puede llamarlo con dos.

CheckVacantSeats(int seatNumber)
SeatManager.CheckVacantSeats(seatNumber, m_nameList); 

su método también es estático, por lo que no tiene sentido tener un constructor.

Creo que lo que buscas es:

SeatManager seatManager = new SeatManager(maxNumberOfSeats);
seatManager.CheckVacantSeats(seatNumber);

También

public bool CheckVacantSeats(int seatNumber)
    {            
        if (m_nameList[seatNumber] == null)
      {
          return true;
      }
      return false;
    }

Respondido 27 Jul 12, 17:07

Está mezclando dos conceptos: una instancia inicializada con un constructor y una clase estática con miembros estáticos. No puede esperar que un método miembro estático acceda a un campo no estático. supongo que tu m_nameList El campo también es estático, de lo contrario, su código ni siquiera se compilaría. Debes elegir cualquiera de las dos formas:

  1. Haz todo SeatManagerlos miembros no estáticos;
  2. gire el SeatManager class en una clase estática que tiene todos los miembros estáticos.

Ya que necesita inicializar el SeatManager con el número total de asientos, la mejor forma parece ser la No. (1). Entonces en lugar de SeatManager.CheckVacantSeats() llamarías a una instancia como mySeatManager.CheckVacantSeats(). Incluso en el caso de que siempre haya una sola instancia de SeatManager — un singleton — este enfoque es mejor. Con un singleton, podría terminar con un public static SeatManager Instance { get; set; } propiedad en SeatManager y trabajar con él de esta manera: SeatManager.Instace.CheckVacantSeats(). Esto generalmente se llama un patrón singleton.

Respondido 27 Jul 12, 17:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.