ayuda constructores c++

Riu

como puedo hacer para que me coja otro valor en num con el constructor ambulancias(int n); habiendo ya inicializado con el otro constructor, ambulancias(int n, int c,int ssoc,int m);....
http://pastebin.com/m7b47a651

#include <iostream>
#include <stdio>
using namespace std;

struct persona{
char email[30];
char nombre[30];
char direccion[30];
int ss;
};

struct datosambulancia{
int codigo;
persona conductor;
int matricula;
};

class ambulancias{
  datosambulancia  ambulancia[15];
  int num;
  public:
  ambulancias(int n);
  ambulancias(int n, int c,int ssoc,int m);
  int devolvernum();
  void cargardatos();
  void mostrar();
  int buscarconductor(char nombre[]);
  ambulancias operator+(datosambulancia d);
  ambulancias operator-(datosambulancia d);
};
        ambulancias::ambulancias(int n){
         num=n;
        }
        ambulancias::ambulancias(int n,int c,int ssoc,int m){
        char mail[30],direc[30],nom[30];
          num=n;
          for(int i=0;i<=n;i++){
          ambulancia[i].codigo=c;
          ambulancia[i].matricula=m;
          ambulancia[i].conductor.ss=ssoc;
          strcpy(ambulancia[i].conductor.email,"\0");
          strcpy(ambulancia[i].conductor.nombre,"\0");
          strcpy(ambulancia[i].conductor.direccion,"\0");
          }
          }
        
void ambulancias::mostrar(){ system("cls"); cout<<"Los Conductores son:"; for(int i=0;i<num;i++){ cout<<"Ambulancia numero"<<i+1<<endl; cout<<ambulancia[i].codigo; cout<<endl<<ambulancia[i].matricula; cout<<endl<<ambulancia[i].conductor.nombre; cout<<endl<<ambulancia[i].conductor.email; cout<<endl<<ambulancia[i].conductor.direccion; cout<<endl<<ambulancia[i].conductor.ss<<endl; } } int ambulancias::devolvernum(){return num; } void ambulancias::cargardatos(){ for(int i=0;i<num;i++){ cout<<"introduce el codigo del ambulancia"; cin>>ambulancia[i].codigo; } } int main(){ int opcion,numeam,devol,cod,ssoc,m; ambulancias a(5,0,0,0); devol=a.devolvernum(); char op; do{ system("cls"); cout<<"\Elija una opcion:"; cout<<"\n1-Guardar datos para las ambulancias disponibles en la empresa"; cout<<"\n2-Busqueda de un conductor"; cout<<"\n3-Aumentar la coleccion de una ambulancia"; cout<<"\n4-Decrementar la coleccion de una ambulancia"; cin>>opcion; switch(opcion){ case 1:{ cout<<"\Introduzca los datos de las ambulancias"; cout<<"\nIntroduce el numero de ambulancias que vas a dar de alta :"; cin>>numeam; ambulancias(numeam); a.cargardatos(); break; } case 2:{ cout<<"\nIntroduzca el nombre de un conductor cualquiera"; } case 3:{ cout<<"\nAnadir una nueva ambulancia"; } case 4:{ cout<<"\nElimine una ambulancia"; } case 5:{ a.mostrar(); system("Pause"); break; } case 6:{exit(0); break;} } }while(opcion!=6); system("Pause"); }
Puni

uhm, si no he entendido mal quieres asignar otro valor a num despues de haber creado un objeto con el constructor de 5 parametros.
porq no simplemente lo modificas a traves del objeto en el struct o haces un metodo que lo modifique?

de todas formas usar structs como Persona es un atentado contra la programacion orientada a objetos, de hecho no se me ocurre un mejor ejemplo para explicarle a alguien lo que es una clase que el tipico clase Persona, objeto Pepe xD

BLZKZ

y nunca inicializas datoambulancia :s. Ademas si no pones constructor predeterminado (aunque sea opcional) nunca podras crear un objeto sin pasarle datos.

Puni

tener un constructor sin parametros no es algo imprescindible ni necesario

Er_Cheru

Según entiendo que es lo que quieres hacer...yo haria un:
void ambulancias::setNum(int numero){
num=numero; (o this->num=numero como veas)
}
como bien dice #2

MTX_Anubis

supongo que #1 estará aprendiendo poo ahora mismo. Ya te lo han dicho, crea un método nuevo para cambiar el número de ambulancias.

Hacer esto:

ambulancias a(5,0,0,0);

y después esto:

cin>> numeam;
ambulancias(numeam);

Está mal, en su lugar debería ser con el método que te han dicho antes.

cin>>numeam;
a.setNum(numeam);

Vamos, le he echado un vistazo por encima y supongo que querrás modificar a :P


Ten en cuenta que 'a' ya está creado y que las constructoras sirven para crear objetos (reservar memoria) e inicializarlos directamente en caso de querer hacerlo, una vez creado el objeto lo tienes que modificar mediante métodos, no puedes modificarlo creando otro objeto.

Sobre la constructora por defecto, siempre es bueno hacerla. Al menos a mí me lo parece, si haces esto: ambulancias X y luego X.devolvernum() a saber el número que te devuelve xD. Luego cuando tus clases tengan punteros, aunque sea para inicializarlos a null y controlarlo un poco.

Puni

No se porq lo llamais constructor por defecto, no es lo mismo q uno sin parametros. En C++ si NO DECLARAS ningun constructor hay un constructor por defecto q no tiene parametros (y obviamente no hace nada). En el momento en el q declaras CUALQUIER constructor el constructor por defecto deja de existir.

Un constructor sin parametros no vale para nada si los objetos de tu clase necesitan algun dato para inicializar el estado del objeto a un estado coherente, a no ser q a modo de test quisieras rellenar alguno de esos datos aleatoriamente y aun asi modificar la implementacion de tu clase para testear no es tampoco una buena tactica a seguir.

Ah, y por ultimo en un metodo como devolverNum deberias poner un const detras. Los metodos Get son selectores y si quieres programar de forma mas robusta lo mejor es q lo hagas selector (en c++ por defecto todos los metodos son modificadores).

BLZKZ

#7 sirve por ejemplo cuando declaras objetos dentro de otras clases y no tiene por qué llevar otro parámetro.

O es mas coherente al hacer una clase declarar un objeto de otra e inicializarlo a un valor (el que tu quieras) y que carece de relevancia?

Según lo que dices es igual de estúpido :D

Puni

Pero vamos a ver, si declaras un objeto sea o no dentro de otra clase y lo haces con un constructor sin parametros es porq esa clase no necesitara parametros. Lo que no tiene sentido es poder crear objetos y q tengan un estado incoherente.

No se si entiende con este codigo de ejemplo, esta muy bien poder crear objetos sin parametros pero si no inicializas el estado del objeto para q te vale? Para sacar un valor basura? Y eso porq es un entero, si estuvieramos hablando de un puntero no solo imprimiria basura si no q como se te ocurra acceder sin inicializarlo probablemente casque por intentar acceder a una posicion de memoria no permitida.

class A {
	int dato;
	public:
	A(){}
	int getDato() const{return this->dato;}
};

class B {
	A a;
	public:
	B(){}
	int getDato() const{return this->a.getDato();}
};

int main(){
	B b;
	cout<<b.getDato(); // MEEC basura
}
BLZKZ

#9 estás espeso

class A {

private:
  int _dato;
public:

  A : _dato(0) {}
  A (int d) {_dato=d;}
};

Dime si eso es incoherente, amén de inicializar valores

class B {

private:

  A _objeto;
  int _c;

public:

/*inserte aquí lo que quieras*/
}; 

No es eso más lógico que:

class A {
private:
  int _dato;

public:
  A (int d) { _dato = d;}
};

class B {
private:
  A objeto(0);
  int _c;

public:

/* lo que te salga */
};

O es que te crees que para declarar un objeto sin pasar parámetros tienes que coger basura?

Será eso, que faltaste a una clase de poo y no aprendiste a inicializar los valores de tal forma que hicieras un constructor lógico sin tener que pasar parámetros ;)

En mi ejemplo es una idiotez, pero si tienes un metodo mutador y tal en clase A pues oye :D si tienes que ir modificando los valores de ese objeto no crees que es idiota la segunda opcion?

Riu

me estais liando ya con las putas peleas que no llevan a ninguna parte.
Yo se que el objeto que creo es a, pero al tener dos constructores con el mismo nombre ambulancias(int n), ambulancias(int n,int c,int ssoc,int m), yo se que para modificar el objeto creado a tengo que usar alguno de sus metodos pero no sabia que era setNum, gracias por decirlo, lo que yo intentaba era llamar al constructor ambulancias y pasarle un valor ya creia que el compilador entendia que al pasarle solo un valor sabia que era el ambulancias(int n) y no el que tiene 4 parametros.

dagavi

Es que el compilador si entiende que si pones ambulancias(5) estás llamando a ambulancias(n) en vez de ambulancias(x, y, z, n).

Pero como bien indica el nombre de este tipo de métodos es una constructora, es decir, crea una nueva instancia de la clase, un nuevo objeto, y a continuación realiza lo que le hayas indicado dentro del método, en este caso se crearía una nueva "ambulancias" con num=5 el resto de valores son indeterminados. No sirve para modificar valores por eso mismo, porque crea nuevas instancia sen vez de trabajar sobre un parámetro implícito.

BLZKZ

#11 es que puedes tener todos los constructores que quieras mientras no sean ambigüos a la hora ser llamados, esto es que si tu declaras un ojeto Ambulancia objeto (4,5,6) sólo pueda crearse con un constructor.

y nuestra discusión debería importarte porque asi aprendes a hacer constructores

Puni

No creo q me entiendas, entre inicializar valores como enteros a 0 o a basura realmente no hay mucha diferencia, realmente ese dato no lo vas a consultar sin haberlo inicializado, no? Pero es q deberias pensar q quien usara tus clases no seras tu, sino un tercero.

A lo que voy no es a q no que no se pueda hacer (la lista de inicializacion se creo para la herencia aunq sea util para estas cosas), si no a que si para una aplicacion no tiene sentido p.ej crear un objeto persona sin el nº del dni, pues eso tendrias q pasarlo en el constructor y no crearlo sin parametros y luego añadirselo con un set.

El constructor sirve para inicializar el estado de un objeto, y no puedes crearlo con un estado incoherente porq te estas cargando la robustez del codigo, a parte de la mantenibilidad si luego tienes q modificar.

BLZKZ

#14 no te gusta entender. Si declaras un objeto de la clase B que tiene uno en su parte privada de la clase A a qué inicializas? a lo que te salga de las narices en la clase B porque no puedes acceder directamente para inicializarlo a un valor relevante, por lo tanto para eso sirve el contructor sin paso de parámetros.

Te cuesta pillar las cosas no? xD

PD: ve a enseñarte a ti mismo los constructores que te veo flojo, y mirate también la forma canónica ortodoxa que te ahorrará muchos quebraderos de cabeza ;)

Usuarios habituales

  • BLZKZ
  • Puni
  • dagavi
  • Riu
  • MTX_Anubis
  • Er_Cheru