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

Sobrecargar método heredado clase string

Estas en el tema de Sobrecargar método heredado clase string en el foro de C/C++ en Foros del Web. Buen día. tengo 2 dudas que me gustaría tener una colaboración de uds para resolverlas. 1) Implemente una clase en C++ que extienda de la ...
  #1 (permalink)  
Antiguo 14/12/2014, 17:11
 
Fecha de Ingreso: noviembre-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 0
Sobrecargar método heredado clase string

Buen día.

tengo 2 dudas que me gustaría tener una colaboración de uds para resolverlas.

1) Implemente una clase en C++ que extienda de la clase estándar std::string,
añadiendo el operator - (char), el cuál debe retornar la cadena pero sin la
primera ocurrencia del char. Ejemplo:
StrExtendida foo = “foobar”;
foo - ‘a’; //Deberia retornar “foobr”

2)Como puedo ver la definición de la clase string , es decir el archivo . h donde esta definida


Gracias por su ayuda.
  #2 (permalink)  
Antiguo 14/12/2014, 17:24
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Sobrecargar método heredado clase string

Definición de la clase string:
http://www.cplusplus.com/reference/string/string/
  #3 (permalink)  
Antiguo 14/12/2014, 21:23
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sobrecargar método heredado clase string

Primero lo primero; es decir:
Cita:
2)Como puedo ver la definición de la clase string , es decir el archivo . h donde esta definida
Ya amchacon te señaló la referencia obligada a la clase string, pero como toda referencia, a diferencia del lenguaje coloquial, cada palabra dentro de su frase tiene un significado específico que hay que entender antes de pasar a la palabra siguiente, lo que exprime la pobre neurona más de lo normal.
Por ejemplo, el tercer párrafo dice:
Cita:
The string class is an instantiation of the basic_string class template that uses char (i.e., bytes) as its character type, with its default char_traits and allocator types (see basic_string for more info on the template).
Lo que traducido y rebajado con tres litros de agua, viene a ser:
una std::string es una instanciación (plasmación) de la clase template basic_string especializada para chars.
En consecuencia, el archivo cabecera que estás buscando está incluído en <string> y es el basic_string.h, que normalmente se encuentra en el directorio include de tu compilador.
Puedes ver un ejemplo de un basic_string.h (de la GNU ISO C++ Library) en
http://www.aoc.nrao.edu/php/tjuerges...8h-source.html

Con respecto al segundo punto, o sea:
Cita:
1) Implemente una clase en C++ que extienda de la clase estándar std::string ...
lamentablemente es una muy mala idea.

Hay diferentes razones, y estoy seguro que no me acuerdo de las más importantes, pero una de ellas, la que para mí ya es suficiente para huir de la idea, es que el destructor de la clase template basic_string no es virtual (fíjate en su declaración).
Esto no necesariamente quiere decir que sea imposible derivar una clase de basic_string, pero sí que va a complicarse, demasiado para mi gusto; en particular porque no va a ser posible invocar al destructor de la clase string derivada.

Por ejemplo:
Código:
class my_string: public std::string{};

std::string* str = new my_string;
delete str; // ¡ay!, no se va a invocar al destructor 
            // de la clase derivada my_string
¿Y entonces?
Entonces nada, joderse tío. ¿qué tiene de malo hacer una función
Código:
void elimina_el_primero_que_encuentra(std::string& str, char ch);
que recorra la string str que recibe por parámetro y elimine la primera ocurrencia del char ch que encuentre?
  #4 (permalink)  
Antiguo 14/12/2014, 21:58
 
Fecha de Ingreso: noviembre-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 0
Respuesta: Sobrecargar método heredado clase string

si es una mala idea, el problema es que no lo hago por gusto, es un taller para entregar, y si he tenido problemas para hacer esa petición.
  #5 (permalink)  
Antiguo 15/12/2014, 07:16
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: Sobrecargar método heredado clase string

Cita:
Iniciado por lareto Ver Mensaje
en particular porque no va a ser posible invocar al destructor de la clase string derivada.
Es posible llamar al destructor explicitamente:

Código C++:
Ver original
  1. class A
  2. {
  3.     int* a;
  4.  
  5.    A(){a = new int;}
  6.    ~A(){delete a;}
  7. }
  8.  
  9. class B : public A
  10. {
  11.     ~B(){ A::~A(); }
  12. }
  #6 (permalink)  
Antiguo 15/12/2014, 07:56
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Sobrecargar método heredado clase string

Cita:
Iniciado por amchacon Ver Mensaje
Es posible llamar al destructor explicitamente:
Sí, pero ese mecanismo falla si se tira de polimorfismo:

Código C++:
Ver original
  1. class A
  2. {
  3.     int* a;
  4.  
  5.    A(){a = new int;}
  6.    ~A(){delete a; std::cout << "A::~A( )" << std::endl; }
  7. }
  8.  
  9. class B : public A
  10. {
  11.     ~B(){ std::cout << "B::~B( )" << std::endl; A::~A(); }
  12. }
  13.  
  14. int main( )
  15. {
  16.   A* a = new B( );
  17.   delete a;
  18. }
  #7 (permalink)  
Antiguo 15/12/2014, 08:04
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sobrecargar método heredado clase string

Copio y pego del ISO/IEC N3690

Cita:
5.3.5 Delete [expr.delete]
1 The delete-expression operator destroys a most derived object (1.8)
or array created by a new-expression.
delete-expression:
:: opt delete cast-expression
:: opt delete [ ] cast-expression

... ... ... ...

3 In the first alternative (delete object), if the static type of the object to
be deleted is different from its dynamic type, the static type shall be a base
class of the dynamic type of the object to be deleted and the static type
shall have a virtual destructor or the behavior is undefined. In the second
alternative (delete array) if the dynamic type of the object to be deleted
differs from its static type, the behavior is undefined.
(las negritas son mías :)
  #8 (permalink)  
Antiguo 15/12/2014, 08:35
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Sobrecargar método heredado clase string

Viendo
Cita:
Iniciado por Recad Ver Mensaje
si es una mala idea, el problema es que no lo hago por gusto, es un taller para entregar, y si he tenido problemas para hacer esa petición.
Y considerando
Cita:
... if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined. ...
Se me ocurre que podrías hacer lo que te piden y, luego de aprobar, naturalmente, arreglártelas para que tu profesor vea esta discusión, y que tenga la oportunidad de aprender algo y dejar de exigir necedades a sus alumnos.

Etiquetas: char, clase, string
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 13:58.