Problema constructor (con codigo) c++

H

Mi problema es el siguiente, El constructor de una clase sirve para iniciar las variables de dicha clase, dichos parametros podrían ser enviados a través del constructor, o iniciándolos como por ejemplo un contador (cont=0). El problema se me presenta a la hora de declarar un objeto dentro del constructor, os pongo el ejemplo:

class Keyboard:public Device{
public:
Keyboard(std::string name):Device(name){
nombre=name;
cont=0;
}
private:
std::string nombre;
int cont;
};

Mi pregunta es, podria tener un objeto de otra clase dentro de keyboard?? como por ejemplo:

class Processor:public Device{
public:
Processor(std::string name):Device(name){
nombre=name;
}
private:
std::string nombre;
};

B

Nombre de hecho ya es un objeto de la clase string. Puedes tener una referencia, un puntero o un objeto mismo como variable de instancia y la inicializas en el constructor a lo que quieras, nada te lo impide.

PD: por legibilidad lo más correcto es que pongas las variables de instancia antes del constructor.

H

si, pero yo estoy obligado a iniciar todas las variables en el constructor, por ejemplo con int me vale con ponerlo = 0 sin la necesidad de que tenga que enviarlo, en cambio no puedo iniciar de la misma forma un objeto procesador dentro de teclado. Creo en la necesidad de tener ese objeto dentro de la clase por las dos siguientes funciones que debo hacer:

Keyboard::connectTo(Processor& cpu): conecta el teclado con un procesador.

void Keyboard::process(): implementación por defecto de un teclado, lee una cadena
de caracteres desde el teclado real utilizando el operador de flujo sobre std::cin. Luego
manda esta cadena al procesador llamando al método process() del procesador al cual está
conectado.

En la conexión debería igualar mi objeto de la clase con el que le paso por connectTo, porque sino esa conexión (simple apariencia vamos, es un ejercicio para jugar con le herencia y tal) solo existiría en el ámbito de la función.

B

Pero por qué tienes que inicializar todas las variables en el constructor? eso es lo que no entiendo :s

Thanat0s

No sé que problema le ves.

En la constructora de Keyboard llamas a la constructora de la otra clase y listo.

Para ser más específico:
En el private de la clase1 declaras una variable de la clase2.
En la constructora de la clase1 llamas a la constructora de la clase2, ya bien sea la de por defecto o si tiene algún parámetro.
Cuando lo necesites llamas a las modificadoras de la clase2 desde la clase1.

Y en concreto:
Keyboard(std::string name) Device(name){
nombre=name;
cont=0;
procesador=new Processor();
}
private:
std::string nombre;
int cont;
Processor procesador;
};

pd: en la destructora de Keyboard haces un delete procesador; procesador=NULL;

BLZKZ

#5 lo has hecho mal, puesto que haces un new a una variable y no a un puntero.

asi que es Processor *processor; y luego como dices el new. De todas formas no es necesario usar punteros... si en processor tienes contructora por defecto ( o parametrizada por defecto que sería la mejor solución) automaticamente al contruir el objeto de la clase keyboard llamaria a la contructora de la clase processor para el atributo procesador de dicha clase.

Keyboard(std::string name, int cont = 0) Device(name) : _nombre(name), _cont(cont) {
};

// Esto es de la interfaz de la clase
private:
std::string _nombre;
int _cont;
Processor _procesador;
};
Con punteros

Por cierto te recomiendo que uses _ delante de los atributos. Se usa por convenio y además es bastante aclaratorio cuando implementas clases, de cuando es un atributo y cuando no sobre todo para la gente que tiene que ver el codigo y no eres tu (o cuando tu lo veas dentro de meses )
PD: thani espero no te sientes humillado por uno de gestion en programacion, es algo normal :3

H

Siguo probando, pero no hay manera humana de que esto funcione...... He simplificado esto todo lo que he podido para pegarlo:

class Processor:public Device{
public:
Processor(std::string name): Device(name){
_nombre=name;
}
private:
std::string _nombre;
};

class Keyboard:public Device{
public:
Keyboard(std::string name): Device(name){
_nombre=name;
_procesador = new Processor();
}
private:
std::string _nombre;
Processor _procesador;
};

Podría llegar a ser el maldito compilador? (Qt Creator), Este código que os he pasado debería funcionar??? o cual sería la correción exacta???

BLZKZ

#7 es imposible que compile esto:

public:
Keyboard(std::string name): Device(name){
_nombre=name;
_procesador = new Processor(); // intentas hacer un new sobre un objeto y no sobre un puntero
}
private:
std::string _nombre;
Processor _procesador; // declaras un objeto de la clase Processor, no un puntero
};

Mas que nada porque te dira que no puedes hacer un new sobre _pocesador, dado que no es un puntero. Si te lees mi respuesta encontraras la solución...

Si quieres hacer un new debes poner en private Processor *_procesador, si no pones el * no pongas esta linea -> _procesador = new Processor(); en la constructora.

Con punteros o sin punteros? en este caso da igual porque no haces un uso grande de memoria.

No hagas mas caso a los de sistemas (thani) que a los de gestion (yo) en POO :P

H

También he probado sin la linea "_procesador = new Processor();" y me reporta el siguiente error: no matching function for call to 'Processor::Processor()'. Haciendo bien el puntero me reporta lo mismo.

BLZKZ

#9 cierto, se me pasó... es que tu costructora de Processor ahora mismo obligatoriamente necesita que le pases un string, prueba a poner:
class Processor:public Device{

public:
Processor(std::string name = ""): Device(name){
_nombre=name;
}
private:
std::string _nombre;
};

Aun así, no entiendo para que quieres el nombre del procesador si luego no se lo metes en keyboard. Si se lo quieres poner despues debes hacer un mutador (set) a la clase Processor, en el caso de querer meterle un nombre directamente en la constructora de keyboard hazlo asi:

class Keyboard:public Device{
public:
Keyboard(std::string name): Device(name){
_nombre=name;
_procesador = new Processor("nombre");
}
private:
std::string _nombre;
Processor *_procesador;
};

Te recomiendo que te mires un libro de como programar OO para c++ desde 0 xD porque estos fallos son de base de POO :/

H

vale, ya he conseguido que funcione, ya me habia vuelto loco y no sabía que hacía gracias xDD. Yo hice el DAI lo que pasa que he tenido la programación parada como un añito, y estaba haciendo unas prácticas que me han pasado para refrescarla jeje. El motivo de que quiera tener una objeto procesador en teclado es el teclado por las dos siguientes funciones que me piden:

Keyboard::connectTo(Processor& cpu): conecta el teclado con un procesador.
void Keyboard::process(): implementación por defecto de un teclado, lee una cadena
de caracteres desde el teclado real utilizando el operador de flujo sobre std::cin. Luego
manda esta cadena al procesador llamando al método process() del procesador al cual está
conectado.

Es lo que se me ha ocurrido, xk si no tengo el objeto procesador en keyboard, la conexion (es solo en apariencia evidentemente) solo duraría en el ambito de la funcion connectTo y luego la función process no funcionaría. Espero estar en lo correto y por cierto mi problema era de punteros, que cuando los explicaste por primera vez los puse mal, y al volver a probar otra vez ya si funcionó.

Gracias por todo!!

Thanat0s

@BLZKZ: estás tu que me acuerdo de punteros, desde que uso Java soy un hombre feliz xD

pd: pero la idea era correcta.
pdd: anda que tu con el JS, vaya paja mental te has hecho xD

BLZKZ

#12 hahaha se me ha ido la pinza muchisimo con lo de js, entendi que no querias usarlo (sin darme cuenta que con lo de document.blalbla lo usabas) cuando dijiste que no querias usar jquery... en fin...

Por cierto llevo meses sin tocar punteros (el mes que viene toca repasito xD)
De todas formas java esta bien para no preocuparte de punteros (puesto que todos son punteros xD) pero optimizacion de memoria -1 :/

H

Yo ni me acordaba tampoco de la existencia de punteros xDD

Thanat0s

#13 Ya pero como no tienes que hacer creates ni deletes pues la cosa va mucho más relajada.
De todas formas a mi me da igual programar con una cosa que con otra, el caso es que ya se me ha olvidado c++ y eso que lo aprobé en junio xD

BLZKZ

#15 creates? como que no? xDDDDDDDDDDDDDDDDDDDDDDDD
En java haces new igual que en c++, lo que pasa es que en java pasas el colector y en c++ te toca meterle el delete

Thanat0s

Me refiero con *, por eso lo puse yo al principio sin el * xD

Usuarios habituales