Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda sobre clases

Estas en el tema de Duda sobre clases en el foro de C/C++ en Foros del Web. ¿Como utilizo una función de una clase dentro de otra?...
  #1 (permalink)  
Antiguo 19/04/2013, 10:15
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Duda sobre clases

¿Como utilizo una función de una clase dentro de otra?
  #2 (permalink)  
Antiguo 19/04/2013, 11:54
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

La cosa sería que me dijesen como escribir para usar el metodo int VectorDinamico :: NCasillas(void) {return(numcasillas);} en otro metodo de la misma clase. Por favor, ayudenme, estoy atascado en eso.
  #3 (permalink)  
Antiguo 19/04/2013, 12:01
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: Duda sobre clases

Puedes mostrar tus clases
  #4 (permalink)  
Antiguo 19/04/2013, 12:05
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

Código C++:
Ver original
  1. #ifndef VECTORDINAMICO
  2. #define VECTORDINAMICO
  3.  
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. class VectorDinamico {
  8.     private:
  9.         double * vector;
  10.         int numcasillas;
  11.  
  12.     public:
  13.         VectorDinamico (void);
  14.         VectorDinamico (int ncasillas);
  15.         VectorDinamico (int ncasillas, double valor);
  16.         ~VectorDinamico (void);
  17.         bool EstaVacio (int ncasillas);
  18.         int NCasillas (void);
  19.         void EscribirValor (double valor, int posicion);
  20.         void LeerValor (int posicion);
  21.         void EscribirVector (int ncasillas);
  22.         void RedimensionarVector (int ncasillas);
  23.         void PintaVector(int ncasillas);
  24.  
  25. };
  26.  
  27. #endif





Código C++:
Ver original
  1. #include <iostream>
  2. #include "VectorDinamico.h"
  3.  
  4. using namespace std;
  5.  
  6. VectorDinamico :: VectorDinamico (void){
  7.    
  8.     vector = new double [10];
  9.    
  10.     for (int i=0; i<10; i++)
  11.         vector[i]=0;
  12.  
  13. }
  14.  
  15. VectorDinamico :: VectorDinamico (int ncasillas){
  16.    
  17.     numcasillas=ncasillas;
  18.     vector = new double [numcasillas];
  19.    
  20.     for (int i=0; i<numcasillas; i++)
  21.         vector[i]=0;
  22.  
  23. }
  24.  
  25. VectorDinamico :: VectorDinamico (int ncasillas, double valor){
  26.    
  27.     ncasillas=numcasillas;
  28.     vector = new double [numcasillas];
  29.  
  30.     for (int i=0; i<numcasillas; i++)
  31.         vector[i]=valor;
  32.  
  33. }
  34.  
  35. VectorDinamico :: ~VectorDinamico (void){
  36.    
  37.     delete [] vector;
  38.    
  39. }
  40.  
  41. int VectorDinamico :: NCasillas (void){
  42.    
  43.     return (numcasillas);
  44. }
  45.  
  46. void VectorDinamico :: EscribirValor (double valor, int posicion){
  47.    
  48.     vector[posicion]=valor;
  49.  
  50. }
  51.  
  52. void VectorDinamico :: LeerValor (int posicion){
  53.  
  54.     cout << vector[posicion] << endl;
  55.  
  56. }
  57.  
  58. void VectorDinamico :: EscribirVector (int ncasillas){
  59.     double valor;  
  60.     for (int i=0; i<ncasillas; i++){
  61.         cout << "Introduce un valor: ";
  62.         cin >> valor;
  63.         vector[i] = valor;
  64.     }
  65. }
  66.  
  67. void VectorDinamico :: PintaVector(int ncasillas){ 
  68.     for (int i=0;i<ncasillas;i++)
  69.         cout << vector[i] << endl;
  70.  
  71.  
  72.  
  73. }
  74.  
  75. bool VectorDinamico :: EstaVacio (int ncasillas){
  76.    
  77.     for (int i=0; i<ncasillas; i++)
  78.         if (vector[i]!=0)
  79.             return (false);
  80.    
  81.     return (true);
  82. }
  #5 (permalink)  
Antiguo 19/04/2013, 13:17
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda sobre clases

"...¿Como utilizo una función de una clase dentro de otra?..."

"...como escribir para usar el metodo int VectorDinamico :: NCasillas(void) {return(numcasillas);} en otro metodo de la misma clase..."

Creo que estas preguntando dos cosas distintas: un metodo de la misma clase puede acceder a otro metodo de la misma clase aun cuando sea privado o protegido. Pero por contra si quieres llamar a un metodo miembro de una clase desde una funcion miembro de otra clase deben ser metodos estaticos o bien una clase debe tener acceso a la otra o bien puedes usar un puntero a la otra clase tal como me respondí a mi mismo en http://www.forosdelweb.com/f96/punte...clase-1026816/

Saludos
vosk
  #6 (permalink)  
Antiguo 19/04/2013, 13:43
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

Ok, entonces vuenvo a elaborar mi pregunta, ¿Cómo utilizo un metodo de una clase dentro de otro de la misma clase?
Segun tu respuesta "un metodo de la misma clase puede acceder a otro metodo de la misma clase aun cuando sea privado o protegido" se pueden usar un metodo dentro de otro sin problemas pero yo estoy intentando hacer esto:

int VectorDinamico :: NCasillas ()
{
return (numcasillas);
}

void VectorDinamico :: PintaVector(){

}
  #7 (permalink)  
Antiguo 19/04/2013, 13:45
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

Perdon:
void VectorDinamico :: PintaVector(){
int n = NCasillas() //Aqui el error
for (int i=0; i<n ; i++)
cout << vector[i] << endl;
}

Y no me funciona.
  #8 (permalink)  
Antiguo 19/04/2013, 13:49
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: Duda sobre clases

que error te marca
?
  #9 (permalink)  
Antiguo 19/04/2013, 13:55
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

A ver, es dificil de explicar ya que no es un error al compilar. Pero consiste basicamente en que relleno el vector con Escribirvector() como puedes ver arriba pero cuando lo muestro con pintavector() sale un numero ilimitado de "0" u otro numero dependiendo del que se introduzca en el constructor. Pero ya he confirmado que el error esta en el int n= NCasillas(), asi que no te preocupes por los demas metodos.
  #10 (permalink)  
Antiguo 19/04/2013, 14:01
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda sobre clases

Pues a mi no me da ningun error

Código:
class VectorDinamico {
    private:
        int numcasillas;
     
    public:
        int NCasillas ();
        void PintaVector();
};
Código:
int VectorDinamico :: NCasillas (){
    return (numcasillas);
}
void VectorDinamico :: PintaVector(){ 
    int n = NCasillas();
		
    for (int i=0;i<n;i++)
        cout << vector[i] << endl;
}
(ojo, no he copiado lo que no afecta al sistema)

Tenemos que: 'NCasillas' es un metodo publico miembro de la clase VectorDinamico, y 'PintaVector' tambien es un metodo publico miembro de la clase VectorDinamico, uno puede acceder al otro sin problemas. Es parecido a tal como tienes en el primer codigo que accedes a 'numcasillas' que es una variable privada no estática miembro de VectorDinamico, que por definicion es accesible y solo accesible (alguna axcepcion) por los miembros definidos en esa clase; para entendernos, una funcion publica es aun mas accesible que una privada, aun asi colgaste el codigo accediendo a un elemento privado pero luego te da error acediendo a uno publico.

Que error te muestra el compilador?

Saludos
vosk
  #11 (permalink)  
Antiguo 19/04/2013, 14:12
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

Eso es lo gracioso que no me da error el compilador. Pero un ejemplode ejecucion seria:


Código C++:
Ver original
  1. int main(void){
  2.    
  3.     int tam, valor;
  4.     cout << "Introduce el tamaño del vector y un valor: ";
  5.     cin >> tam >> valor; // 5 0
  6.     VectorDinamico v = VectorDinamico(tam,valor);
  7.    
  8.     cout << "¿Esta el vector vacio?: ";
  9.     bool vacio = v.EstaVacio(tam);
  10.     if(vacio==true)
  11.         cout << "si" << endl;
  12.     else
  13.         cout << "No" << endl;
  14.  
  15.     cout << "Rellenar Vector" << endl; 
  16.     v.EscribirVector(tam); // 1 2 3 4 5
  17.  
  18.     cout << "Vector: " << endl;
  19.     v.PintaVector();  //000000000000000000000000000000000000000000000000000000000000000000000 <- Este es el error.
  20.  
  21.  
  22.  
  23.  
  24.  
  25.    
  26. }
  #12 (permalink)  
Antiguo 19/04/2013, 14:30
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda sobre clases

Acabo de darme cuenta: tienes mal asignado el valor de entrada

Código:
VectorDinamico :: VectorDinamico (int ncasillas, double valor){
       
        ncasillas = numcasillas;
Corrige y comprueba otra vez, ok?

Saludos
vosk
  #13 (permalink)  
Antiguo 19/04/2013, 14:42
 
Fecha de Ingreso: enero-2013
Mensajes: 25
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda sobre clases

En fin... gracias xD Ya me funciona.
  #14 (permalink)  
Antiguo 19/04/2013, 15:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda sobre clases

Un truco de depurador: cuando te salen estos valores que 'no pueden ser' la mayoria de las veces es que tienes alguna variable no inicializada a la que por defecto se le asigna un bloque de memoria reutilizado, es decir que contiene datos basura de operaciones anteriores (de la misma aplicacion o incluso de otras). La idea es no suponer que una variable recien declarada se inicializa a 0 hasta que manualmente le asignas 0

Saludos
vosk

Etiquetas: clases
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:47.