C/Visual C - A conococedores de la POO con C++

 
Vista:

A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 05/08/2003 21:14:04
Hola a todos. Esta es una pregunta un poco teórica, pero es que estoy preparando un exámen para septiembre y tengio una duda. Os cuento:
Se trata de diseñar un pequeño programa en C++ (de definir las clases más que nada) que simule a Windows. Para ello tengo que diseñar una clase "ESCRITORIO" que debe contener varios "ELEMENTOS". Éstos a su vez, pueden ser (clase) botones, (clase) iconos, etc.... Tengo en la clase "ELEMENTOS" una función virtual pura con lo que se convierte en abstracta y, por ello, no puedo construir objetos de ese tipo.
¿Cómo puedo hacer para que, dentro de la clase "ESCRITORIO", pueda construir "ELEMENTOS? teniendo en cuenta que éstos son abstractos?
Un saludo y os agradezco la ayuda que podais prestarme.
Sebas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:A conococedores de la POO con C++

Publicado por chuidiang (677 intervenciones) el 06/08/2003 07:55:41
No puedes hacer directamente new ELEMENTOS() porque como bien dices, es clase abstracta. Sin embargo, si puedes hacer esto

ELEMENTOS *tabla[10]; // 10 punteros a elemento

tabla[0] = new boton(...);
tabla[1] = new icono(...);
...

Es decir, ESCRITORIO puede contener una tabla de punteros a elemento y alguien debe hacer los new de los botones, iconos o lo que sea. ESCRITORIO los verá y manejará como si fueran elementos.

Si no quieres que ESCRITORIO cree esos elementos, puedes ponerle un metodo tomaNuevoElemento (ELEMENTO *) que añade el elemento que se le pasa a la tabla. Alguien, fuera de escritorio, hará los new de botones o iconos y los metera en escritorio a través de ese método.

No sé si esto contesta la duda ...

Se bueno
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 07/08/2003 17:45:57
Gracias Chuidiang. Pero.. ¿qué pasa si no sé cuantos elementos va a tener el escritorio?. Mi intención es que el usuario diga cuantos van a ser y en ese momento los construiria. Pero al ser abstracta no puedo.
¿Se te ocurre alguna solución adicional?

Saludos

Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 07/08/2003 17:46:33
Gracias Chuidiang. Pero.. ¿qué pasa si no sé cuantos elementos va a tener el escritorio?. Mi intención es que el usuario diga cuantos van a ser y en ese momento los construiria. Pero al ser abstracta no puedo.
¿Se te ocurre alguna solución adicional?

Saludos

Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por chuidiang (677 intervenciones) el 07/08/2003 22:21:12
Bueno, la sintaxis es un poco liada y no puedo probarla, asi que disculpa los errores que haya.

Tienes que hacer un array (dinamico) de punteros a elemento. Creo que sería algo así como esto

elemento **tablaElementos;

Cuando sepas cuantos elementos hay, haces el new de "punteros a elemento"

tablaElementos = (elemento **)new (elemento *); // tengo mis dudas de la sintaxis, pero espero que la idea esté clara.

Luego ya se van haciendo los new concretos de los iconos y lo otro (no recuerdo que era)

tablaElementos[i] = new icono(...);
tablaElementos[j] = new lo_otro(...);

Si quieres hacerlo un poco más liado, en vez de un array puedes usar una lista. El nodo de la lista contendría dos campos, el consabido "siguiente" y el campo "info", que sería un puntero a elemento

nodo
{
nodo *siguiente;
elemento *info;
}

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 08/08/2003 14:16:58
Captada la idea chuidiang.
Voy a probar lo de crear un vector de punteros. Yo, hasta ahora, la única solución que veía era la que me propones como segunda opción; pero que es más rebuscada.
Saludos
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 08/08/2003 21:47:45
Chuidiang, funciona de coña. Pero una cosa que no termino de entender: declaro
Elemento **Tabla
y construyo ¿una tabla de punteros a elementos?
Tabla=new (Elemento *)
Pero... yo en ningun momento he dicho cuántos elementos quiero:-)))
Y lo he probado con 2, 3, 4... y FUNCIONA!!! sin violaciones de segmento ¿cómo es posible? Entiendo que al construir la tabla depunteros habría de indicar el tamaño de ésta. Algo así como:
Tabla=new (Elemento *)[n] pero el compilador no lo pasa
Podrías explicarme por qué?
Gracias
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por BluSky (28 intervenciones) el 08/08/2003 21:48:23
Chuidiang, funciona de coña. Pero una cosa que no termino de entender: declaro
Elemento **Tabla
y construyo ¿una tabla de punteros a elementos?
Tabla=new (Elemento *)
Pero... yo en ningun momento he dicho cuántos elementos quiero:-)))
Y lo he probado con 2, 3, 4... y FUNCIONA!!! sin violaciones de segmento ¿cómo es posible? Entiendo que al construir la tabla depunteros habría de indicar el tamaño de ésta. Algo así como:
Tabla=new (Elemento *)[n] pero el compilador no lo pasa
Podrías explicarme por qué?
Gracias
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:A conococedores de la POO con C++

Publicado por chuidiang (677 intervenciones) el 08/08/2003 22:37:09
No te fies.

Efectivamente, deberías dar el tamaño. Si no encuentras la sintaxis adecuada, trata de definir un typedef

typedef elemento *elementoPtr;

y luego haces el

tabla = new elementoPtr[33].

El por que funciona es aleatorio. Cuando un programa hace un new, el sistema operativo le asigna (si es necesario) uno o mas bloques completos de memoria (segmentos), aunque solo pida 4 bytes para un puntero como en tu caso. Al estar el segmento entero reservado para ti, mientras no te salgas de el, no tendras violaciones de segmento, aunque tus punteros anden un poco "desmadrados". Eso si, se pueden machacar mas adelante otras variables o datos que hayas reservado con new. Segun vayas complicando tu programa y haciendo mas news y deletes, es facil que te empiecen a pasar "cosas raras" (variables que cambian misteriosamente de valor, etc).

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar