• Domingo 28 de Abril de 2024, 22:10

Autor Tema:  Error al declarar una clase...  (Leído 2556 veces)

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Error al declarar una clase...
« en: Sábado 21 de Mayo de 2011, 21:49 »
0
Hola a todos.
Espero que me tengan mucha paciencia y comprencíon ya que estoy estudiando con un manual y no tengo otra consulta que los foros y tutoriales de la web( y tengo 59 años).-
El programa que expongo a continuación me genera un el siguiente error.-
Citar
'Clientes.datos.vec' no es accesible debido a su nivel de protección
Seguramente estoy declarando mal la clase pero si le pongo public empeora.-

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. class Clientes
  5. {
  6.     class datos
  7.     {
  8.         private string [] vec;
  9.         public datos()
  10.         {  
  11.             vec = new String[7];
  12.         }
  13.         public string this[int indice]
  14.         {
  15.             set
  16.             {
  17.                 vec[indice] = value;
  18.             }
  19.             get
  20.             {
  21.                 return vec[indice];
  22.             }
  23.         }  
  24.     }  
  25.  
  26.     public static void detalle()
  27.     {
  28.         for(byte a = 1; a<50; a++)
  29.         {
  30.             Console.SetCursorPosition(a,00); Console.Write("=");
  31.             Console.SetCursorPosition(a,02); Console.Write("=");
  32.         }
  33.         Console.SetCursorPosition(17,01);
  34.         Console.Write(" Alta de Clientes ");
  35.         Console.SetCursorPosition(01,04);
  36.         Console.Write(" Nombre completo....:");
  37.         Console.SetCursorPosition(01,05);
  38.         Console.Write(" Dirección..........:");
  39.         Console.SetCursorPosition(01,06);
  40.         Console.Write(" Cód. postal........:");
  41.         Console.SetCursorPosition(01,07);
  42.         Console.Write(" Ciudad.............:");
  43.         Console.SetCursorPosition(01,08);
  44.         Console.Write(" Celular............:");
  45.         Console.SetCursorPosition(01,09);
  46.         Console.Write(" Crédito............:");
  47.         Console.SetCursorPosition(01,10);
  48.         Console.Write(" Plazo en días......:");
  49.     }
  50.    
  51.     public static void ingreso()
  52.     {
  53.         datos _datos = new datos();
  54.         byte ver = 04;
  55.         string linea = "";
  56.         for(int cont = 0; cont<7; cont++)
  57.         {
  58.             do
  59.             {
  60.                 Console.SetCursorPosition(22,ver);
  61.                 linea = Console.ReadLine();
  62.             }while((linea == null) || (linea.Length==0));
  63.            // _datos.vec[cont] = linea;
  64.             ver++;
  65.         }  
  66.     }  
  67.    
  68.     public static void Main(string[] args)
  69.     {
  70.         Console.Title = " Alta de Clientes";
  71.         detalle();
  72.         ingreso();
  73.        
  74.        
  75.         Console.SetCursorPosition(01,12);
  76.         Console.Write(" Pulse una tecla para finalizar..."); Console.ReadKey();  
  77.     }
  78. }
  79.  

Espero me puedan ayudar.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

Valinor73

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #1 en: Domingo 22 de Mayo de 2011, 17:27 »
0
Creo que el problema esta en que dentro de la definicion de una clase no es posible la definicion de otra. Estas definiendo la clase datos dentro de la clase Clientes, cuando lo correcto a mi entender es que la crees separada. Una vez definidas las dos clases si que te sera posible crear en cualquier clase, objectos de la otra.
Pruebalo. Si no es asi que alguien me corrija.
Un saludo

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #2 en: Domingo 22 de Mayo de 2011, 18:25 »
0
Hola Valinor73.
Esta línea estaba mal: // _datos.vec[cont] = linea; esta es la manera correcta para que funcione  _datos[cont] = linea;.-
Ahora tengo otro inconveniente, no logro leer el array desde el método principal, si desearan ayudarme yo agradecido.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #3 en: Domingo 22 de Mayo de 2011, 20:58 »
0
Bueno, escribi mi respuesta hace 3 horas, pero no pude publicarla antes porque tuve que salir, veo que te contestaron en parte, aun asi, publico mi respuesta, con comentarios a ver si asi te queda mas claro.

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. // Las clases no se anidan una dentro de otra, deben ir separadas.
  6. // Y de preferencia, una clase en cada archivo de codigo, esto
  7. // ultimo no es obligatorio, pero si recomendado.
  8. class datos
  9. {
  10.     // Declara vec de tipo public, no private, para evitar el error que te marca,
  11.     // no se cual era el problema que dices que
  12.     // te da haciendolo public, pero a mi no me da problema. Si te da
  13.     // problema con public, menciona especificamemnte cual es.
  14.     public string[] vec;
  15.     public datos()
  16.     {
  17.         vec = new String[7];
  18.     }
  19.     // Ya que estas declarando vec como public, no es necesario usar
  20.     // set/get, este solo se utilizaria si vec fuera private, pero
  21.     // lo estas haciendo mal de todas formas, ya que no puedes usar
  22.     // this como nombre de propiedad, pues this es palabra reservada
  23.     // de C#. La convencion normal (digo convencion, por que no es
  24.     // obligatorio, pero es algo que casi todo programador de C# hace)
  25.     // es usar nombres de variables con minuscula para variables privadas
  26.     // y nombres de variables con mayuscula para variables publicas.
  27.     // En otro bloque te pondre la manera correcta de hacerlo
  28.     //public string this[int indice]
  29.     //{
  30.     //    set
  31.     //    {
  32.     //        vec[indice] = value;
  33.     //    }
  34.     //    get
  35.     //    {
  36.     //        return vec[indice];
  37.     //    }
  38.     //}
  39. }
  40.  
  41.  
  42. class Clientes
  43. {
  44.  
  45.     public static void detalle()
  46.     {
  47.         for (byte a = 1; a < 50; a++)
  48.         {
  49.             Console.SetCursorPosition(a, 00); Console.Write("=");
  50.             Console.SetCursorPosition(a, 02); Console.Write("=");
  51.         }
  52.         Console.SetCursorPosition(17, 01);
  53.         Console.Write(" Alta de Clientes ");
  54.         Console.SetCursorPosition(01, 04);
  55.         Console.Write(" Nombre completo....:");
  56.         Console.SetCursorPosition(01, 05);
  57.         Console.Write(" Dirección..........:");
  58.         Console.SetCursorPosition(01, 06);
  59.         Console.Write(" Cód. postal........:");
  60.         Console.SetCursorPosition(01, 07);
  61.         Console.Write(" Ciudad.............:");
  62.         Console.SetCursorPosition(01, 08);
  63.         Console.Write(" Celular............:");
  64.         Console.SetCursorPosition(01, 09);
  65.         Console.Write(" Crédito............:");
  66.         Console.SetCursorPosition(01, 10);
  67.         Console.Write(" Plazo en días......:");
  68.     }
  69.  
  70.     public static void ingreso()
  71.     {
  72.         datos _datos = new datos();
  73.         byte ver = 04;
  74.         string linea = "";
  75.         for (int cont = 0; cont < 7; cont++)
  76.         {
  77.             do
  78.             {
  79.                 Console.SetCursorPosition(22, ver);
  80.                 linea = Console.ReadLine();
  81.             } while ((linea == null) || (linea.Length == 0));
  82.             _datos.vec[cont] = linea;
  83.             ver++;
  84.         }
  85.     }
  86.  
  87.     public static void Main(string[] args)
  88.     {
  89.         Console.Title = " Alta de Clientes";
  90.         detalle();
  91.         ingreso();
  92.  
  93.  
  94.         Console.SetCursorPosition(01, 12);
  95.         Console.Write(" Pulse una tecla para finalizar..."); Console.ReadKey();
  96.     }
  97. }
  98.  
  99.  

Clase datos usando set/get, y variables privadas.

Código: C#
  1.  
  2. class datos
  3. {
  4.     // Declara vec con minuscula para la variable private
  5.     private string[] vec;
  6.     // Declara la propiedad vec con mayuscula para la parte public
  7.     // Recuerda que ahora utilizaras _datos.Vec[cont] en lugar de
  8.     // _datos.vec[cont], ya que vec ahora es private
  9.     public string[] Vec
  10.     {
  11.         set
  12.         {
  13.             vec = value;
  14.         }
  15.         get
  16.         {
  17.             return vec;
  18.         }
  19.     }
  20.     public datos()
  21.     {
  22.         vec = new String[7];
  23.     }
  24. }
  25.  
  26.  

Citar
Ahora tengo otro inconveniente, no logro leer el array desde el método principal, si desearan ayudarme yo agradecido.-

No entiendo aqui especificamente que es lo que deseas hacer, si pudieras explicarnos mejor y de manera mas clara, seria excelente.

Si hiciste modificaciones al codigo que publicaste originalmente, publicalo de nuevo, especificando el error que te marca, y en que linea obtienes el error.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #4 en: Domingo 22 de Mayo de 2011, 22:53 »
0
Hola Profe
Que interesante para un estudiante solitario como yo encontrar a alguien con tanta predisposición para ayudar(enseñar) y tan didáctico.-
Te dejo mi código para que me digas porque desde el método Main no puedo leer el array.-


Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. class Clientes
  5. {
  6.     class datos
  7.     {
  8.         private string [] vec;
  9.         public datos()
  10.         {   
  11.             vec = new String[7];
  12.         }
  13.         public string this[int indice]
  14.         {
  15.             set
  16.             {
  17.                 vec[indice] = value;
  18.             }
  19.             get
  20.             {
  21.                 return vec[indice];
  22.             }
  23.         }   
  24.     }   
  25.  
  26.     public static void detalle()
  27.     {
  28.         for(byte a = 1; a<50; a++)
  29.         {
  30.             Console.SetCursorPosition(a,00); Console.Write("=");
  31.             Console.SetCursorPosition(a,02); Console.Write("=");
  32.         }
  33.         Console.SetCursorPosition(17,01);
  34.         Console.Write(" Alta de Clientes ");
  35.         Console.SetCursorPosition(01,04);
  36.         Console.Write(" Nombre completo....:");
  37.         Console.SetCursorPosition(01,05);
  38.         Console.Write(" Dirección..........:");
  39.         Console.SetCursorPosition(01,06);
  40.         Console.Write(" Cód. postal........:");
  41.         Console.SetCursorPosition(01,07);
  42.         Console.Write(" Ciudad.............:");
  43.         Console.SetCursorPosition(01,08);
  44.         Console.Write(" Celular............:");
  45.         Console.SetCursorPosition(01,09);
  46.         Console.Write(" Crédito............:");
  47.         Console.SetCursorPosition(01,10);
  48.         Console.Write(" Plazo en días......:");
  49.     }
  50.    
  51.     public static void ingreso()
  52.     {
  53.         datos _datos = new datos();
  54.         string linea = "";
  55.         for(int cont = 0; cont<7; cont++)
  56.         {
  57.             do
  58.             {
  59.                 Console.SetCursorPosition(22,cont+4);
  60.                 linea = Console.ReadLine();
  61.             }while((linea == null) || (linea.Length==0));
  62.             _datos[cont] = linea;
  63.         }   
  64.     }   
  65.    
  66.     public static void Main(string[] args)
  67.     {
  68.         Console.Title = " Alta de Clientes";
  69.  
  70.         detalle();
  71.         ingreso();
  72.         datos d_atos = new datos();
  73.        
  74.         Console.SetCursorPosition(01,12);  
  75.         [i]Console.WriteLine(" Dirección...:" + d_atos[0]);[/i] Console.ReadKey();
  76.     }
  77. }
  78.  

Bueno eso es todo, luego pondré en práctica lo del post anterior.-

Saludos Profe.-
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #5 en: Lunes 23 de Mayo de 2011, 03:42 »
0
Bueno, en el nuevo codigo que publicaste no has hecho las correcciones que te dije. Debiste hacerlo, pero bueno  :rolleyes:

Te dejo el codigo corregido de nuevo, con las correcciones que te mencione anteriormente, ademas de nuevas correcciones con comentarios para que sepas el porque de tu error, espero que lo comprendas mejor.

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. class datos
  6. {
  7.     public string[] vec;
  8.     public datos()
  9.     {
  10.         vec = new String[7];
  11.     }
  12. }
  13.  
  14. class Clientes
  15. {
  16.     // Debes declarar la variable como static, para poder
  17.     // acceder a ella en metodos static
  18.     static datos _datos;
  19.     public static void detalle()
  20.     {
  21.         for (byte a = 1; a < 50; a++)
  22.         {
  23.             Console.SetCursorPosition(a, 00); Console.Write("=");
  24.             Console.SetCursorPosition(a, 02); Console.Write("=");
  25.         }
  26.         Console.SetCursorPosition(17, 01);
  27.         Console.Write(" Alta de Clientes ");
  28.         Console.SetCursorPosition(01, 04);
  29.         Console.Write(" Nombre completo....:");
  30.         Console.SetCursorPosition(01, 05);
  31.         Console.Write(" Dirección..........:");
  32.         Console.SetCursorPosition(01, 06);
  33.         Console.Write(" Cód. postal........:");
  34.         Console.SetCursorPosition(01, 07);
  35.         Console.Write(" Ciudad.............:");
  36.         Console.SetCursorPosition(01, 08);
  37.         Console.Write(" Celular............:");
  38.         Console.SetCursorPosition(01, 09);
  39.         Console.Write(" Crédito............:");
  40.         Console.SetCursorPosition(01, 10);
  41.         Console.Write(" Plazo en días......:");
  42.     }
  43.  
  44.     public static void ingreso()
  45.     {
  46.         string linea = "";
  47.         for (int cont = 0; cont < 7; cont++)
  48.         {
  49.             do
  50.             {
  51.                 Console.SetCursorPosition(22, cont + 4);
  52.                 linea = Console.ReadLine();
  53.             } while ((linea == null) || (linea.Length == 0));
  54.             _datos.vec[cont] = linea;
  55.         }
  56.     }
  57.  
  58.     public static void Main(string[] args)
  59.     {
  60.         Console.Title = " Alta de Clientes";
  61.  
  62.         // Creas un nuevo objeto de tipo "datos"
  63.         _datos = new datos();
  64.         detalle();
  65.         ingreso();
  66.  
  67.         // Esto es incorrecto para lo que creo que quieres hacer.
  68.         // Cada vez que usas new creas un nuevo objeto.
  69.         // por lo tanto, el nuevo objeto d_atos, no es el mismo
  70.         // que _datos, son del mismo tipo, pero NO son el mismo
  71.         // objeto, cada objeto es independiente uno del otro,
  72.         // por lo tanto no puedes esperar que d_atos contenga lo
  73.         // que capturaste en _datos, para obtener lo que capturaste
  74.         // en _datos, debes declarar _datos como static al
  75.         // principio de la clase para poder acceder a el desde los
  76.         // metodos static (Lo que ya hice en esta ejemplo corregido).
  77.         // Si los metodos no fueran static, no seria
  78.         // necesario declarar _datos como static, pero entonces
  79.         // necesitarias crear una instancia (objeto) de
  80.         // la clase clientes para acceder a los metodos no estaticos
  81.         // detalle() e ingreso(). No se si me entiendas.
  82.  
  83.         //datos d_atos = new datos();
  84.        
  85.         Console.SetCursorPosition(01,12);  
  86.         Console.WriteLine(" Nombre...:" + _datos.vec[0]); Console.ReadKey();
  87.     }
  88. }
  89.  
  90.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #6 en: Martes 24 de Mayo de 2011, 02:32 »
0
Hola Profe.
Me pudrías decir que criterio debo utilizar para saber cuando utilizar las propiedades en c#,
me parecía que era una manera avanzada de programar y me encuentro que en el código anterior la terminaste descartando, te pido x favor que me lo expliques para saber a que atenerme.-

Un gran abrazo.-
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #7 en: Martes 24 de Mayo de 2011, 04:55 »
0
Cita de: "LenguajeC"
Me pudrías decir que criterio debo utilizar para saber cuando utilizar las propiedades en c#,

En realidad es un poco a gusto del programador, y segun lo necesite el programa. cada programa es diferente.

Segun el paradigma de la programacion orientada a objetos, no es bueno tener acceso directo a las variables internas de una clase, para evitar efectos secundarios inesperados, todo acceso debe ser por medio de metodos set/get, parametros y mensajes.

Yo en la practica solo utilizo set y get cuando necesito que la variable sea solo de lectura o solo de escritura. O sea que si necesito leer la variable, pero no escribirla, utilizo get, y omito el get, y si necesito escribir la variable, pero no leerla, utilizo set y omito el get. Si necesito leer y escribir la variable, la hago public directamente. Aun asi, no debes abusar de ello, en lo posible debes tratar de que cada objeto sea independiente del exterior, y evitar las variables public en lo posible. Solo cuando sea de veras necesario

De hecho, tu programa no esta correctamente encapsulado, ya que llamas por fuera a variables de tu clase, y manipulas la clase con metodos externos, lo mas correcto hubiera sido definir los metodos dentro de la misma clase datos, para manipular la variable vec dentro de la clase y evitar manipulacion externa de la clase.

Te dejo un ejemplo de como lo hubiera hecho, eso te lo aclarara un poco mas. Nota como manejo el vector internamente dentro de la clase datos, y no necesito acceder al vector dentro de main(), si esta correctamente encapsulado ;)

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. class datos
  6. {
  7.     private string[] vec;
  8.    
  9.     public datos()
  10.     {
  11.         vec = new String[7];
  12.     }
  13.    
  14.     public void detalle()
  15.     {
  16.         for (byte a = 1; a < 50; a++)
  17.         {
  18.             Console.SetCursorPosition(a, 00); Console.Write("=");
  19.             Console.SetCursorPosition(a, 02); Console.Write("=");
  20.         }
  21.         Console.SetCursorPosition(17, 01);
  22.         Console.Write(" Alta de Clientes ");
  23.         Console.SetCursorPosition(01, 04);
  24.         Console.Write(" Nombre completo....:");
  25.         Console.SetCursorPosition(01, 05);
  26.         Console.Write(" Dirección..........:");
  27.         Console.SetCursorPosition(01, 06);
  28.         Console.Write(" Cód. postal........:");
  29.         Console.SetCursorPosition(01, 07);
  30.         Console.Write(" Ciudad.............:");
  31.         Console.SetCursorPosition(01, 08);
  32.         Console.Write(" Celular............:");
  33.         Console.SetCursorPosition(01, 09);
  34.         Console.Write(" Crédito............:");
  35.         Console.SetCursorPosition(01, 10);
  36.         Console.Write(" Plazo en días......:");
  37.     }
  38.  
  39.     public void ingreso()
  40.     {
  41.         string linea = "";
  42.         for (int cont = 0; cont < vec.Length ; cont++)
  43.         {
  44.             do
  45.             {
  46.                 Console.SetCursorPosition(22, cont + 4);
  47.                 linea = Console.ReadLine();
  48.             } while ((linea == null) || (linea.Length == 0));
  49.             vec[cont] = linea;
  50.         }
  51.     }
  52.  
  53.     public void imprime()
  54.     {
  55.         Console.SetCursorPosition(01, 12);
  56.         Console.WriteLine("Nombre...:" + vec[0]);
  57.         Console.ReadKey();
  58.     }
  59. }
  60.  
  61. class Clientes
  62. {
  63.     static datos _datos;
  64.  
  65.     public static void Main(string[] args)
  66.     {
  67.         Console.Title = " Alta de Clientes";
  68.  
  69.         _datos = new datos();
  70.         _datos.detalle();
  71.         _datos.ingreso();
  72.         _datos.imprime();
  73.  
  74.     }
  75. }
  76.  
  77.  
  78.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: Error al declarar una clase...
« Respuesta #8 en: Miércoles 25 de Mayo de 2011, 18:58 »
0
Hola profe.
Muchas gracias y tendré que combinar más la práctica con la teoría.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-