elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Operador de conversion C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Operador de conversion C++  (Leído 3,291 veces)
xoker

Desconectado Desconectado

Mensajes: 24



Ver Perfil WWW
Operador de conversion C++
« en: 16 Abril 2014, 19:02 pm »

Buenas a todos estoy aprendiendo C++ y tengo un problema con el operador de conversion en un programa que estoy haciendo para ver como se usa, pongo aqui el codigo de una clase llamada Cadena, el objetivo del codigo es hacer una burda implementacion de la clase string de C++, para ello uso algunas funciones de la biblioteca cstring de C:

Código:

//El .h de la clase resumido:

class Cadena{
public:
                //Constructores:
Cadena(unsigned tam = 1, char relleno = ' ');
Cadena(const Cadena& copia);
Cadena(char* palabra_aux);
Cadena(const char*);
                
                //Aqui cabecera del metodo del operador de conversion
operator const char*() const;

~Cadena();

private:
int _tamano;
char* _palabra;
};

//Pongo fuera aposta este metodo para que realice la operacion de conversion.
Cadena& operator +(const Cadena& op1, const Cadena& op2);


//El .cpp de la parte que nos interesa:

Cadena& operator +(const Cadena& op1, const Cadena& op2){
Cadena auxiliar(op1.length() + op2.length() + 1); //Lo que hago es crear un                    //nuevo objeto y reservar espacio para el char* que voy a meterle.

strcpy(auxiliar, op1); // <-- Aqui es donde peta!
strcat(auxiliar, op2);

        return auxiliar;
}

Cadena::operator const char*() const{
return _palabra;
}


Lo que yo trado de hacer es lo siguiente:

-Como no puedo acceder a los atributos privados desde un metodo externo a la clase, en strcpy (auxiliar. op1) lo que hago con auxiliar es pasarle el objeto y como deberia de recibir un char*, va al operador de conversion de tipo char* y me transforma el objeto en un char* listo para strcpy... O eso es la teoria porque me da el siguiente error (entre un monton mas de otros temas...)

El error que que da es este:

[Error] invalid user-defined conversion from 'Cadena' to 'char*' [-fpermissive]
[Note] candidate is: Cadena::operator const char*() const <near match>
[Note] no known conversion for implicit 'this' parameter from 'const char*' to 'char*'

A ver si teneis idea de cual es el problema!!

Muchas gracias y un saludo!!


« Última modificación: 16 Abril 2014, 19:18 pm por xoker » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Operador de conversion C++
« Respuesta #1 en: 16 Abril 2014, 20:57 pm »

No se si es solo esto, pero: Lo tienes como "operator const char*()...".
Si es const, no lo puedes cambiar. Prueba a quiatrle el const.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Operador de conversion C++
« Respuesta #2 en: 16 Abril 2014, 21:45 pm »

O haz un cast explícito:
Código
  1. Cadena::operator const char*() const{
  2. return (const char*) _palabra;
  3. }
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xoker

Desconectado Desconectado

Mensajes: 24



Ver Perfil WWW
Re: Operador de conversion C++
« Respuesta #3 en: 17 Abril 2014, 11:30 am »

Nada chicos, ni una cosa ni la otra, da exactamente el mismo error.

Os pongo aqui ambos archivos completos, el .cpp y el .h, quizas sea de otra cosa que no veo.

El .cpp:

Código:
#include <iostream>
#include <cstring>
#include "cadena.h"


Cadena::Cadena(unsigned tam, char relleno): _tamano(tam){
_palabra = new char[_tamano + 1];

for(int i = 0 ; i < _tamano; i++){
_palabra[i] = relleno;
}

_palabra[_tamano] = '\0';
}

Cadena::Cadena(const Cadena& copia){
_tamano = copia._tamano;
strcpy(_palabra, copia._palabra);
}

Cadena::Cadena(char* palabra_aux){
_tamano = strlen(palabra_aux);
strcpy(_palabra, palabra_aux);
}

Cadena& Cadena::operator = (char* palabra_aux){
Cadena auxiliar(strlen(palabra_aux));
strcpy(auxiliar._palabra, palabra_aux);
return auxiliar;
}

Cadena& Cadena::operator = (const Cadena& copia){
Cadena auxiliar(copia);
return auxiliar;
}

Cadena::operator const char*() const{
return (const char*)_palabra;
}

Cadena& operator +(const Cadena& op1, const Cadena& op2){
Cadena auxiliar(op1.length() + op2.length() + 1);

strcpy(auxiliar, op1);
strcat(auxiliar, op2);

return auxiliar;
}

char Cadena::operator[] (int i) const{
return _palabra[i];
}

char Cadena::at(int i){
char caracter;
if(i < _tamano && i > 0){
caracter = _palabra[i];
}
else{
throw std::out_of_range("Fuera de Rango");
}

return caracter;
}

bool operator ==(const Cadena& op1, const Cadena& op2){
bool resultado = true;

resultado = !(stricmp(op1, op2));

return resultado;
}

bool operator !=(const Cadena& op1, const Cadena& op2) const{
return !(operator == (op1, op2));
}

bool operator > (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;

for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}

if(cantidad > 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}

bool operator < (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;

for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}

if(cantidad < 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}

bool operator <= (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;

for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}

if(cantidad <= 0){
resultado = true;
}
else{
resultado = false;
}

return resultado;
}

bool operator >= (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;

for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}

if(cantidad >= 0){
resultado = true;
}
else{
resultado = false;
}

return resultado;
}

int Cadena::length() const{
return _tamano;
}

Cadena Cadena::substr (unsigned inicio, unsigned desplaza){
int limite = inicio + desplaza;
char palabra_auxiliar[desplaza + 1];
Cadena auxiliar(deplaza+1);
if(inicio + desplaza > _tamano){
throw std::out_of_range("Fuera de Rango");
}
else{
for(int i = 0 ; i < desplaza ; i++){
palabra_auxiliar[i] = _palabra[inicio + i];
}
}
auxiliar = palabra_auxiliar;
return auxiliar;
}

Cadena::~Cadena(){
delete[] _palabra;
}

Ahora el .h:

Código:
#ifndef CADENA_H_
#define CADENA_H_

class Cadena{
public:
Cadena(unsigned tam = 1, char relleno = ' ');
Cadena(const Cadena& copia);
Cadena(char* palabra_aux);
Cadena(const char*);
Cadena& operator = (char* palabra_aux);
Cadena& operator = (const Cadena& copia);
char operator[] (int i);
operator const char*() const;

int length() const;
char at(int i);
Cadena substr (unsigned inicio, unsigned desplaza);

~Cadena();

private:
int _tamano;
char* _palabra;
};


Cadena& operator +(const Cadena& op1, const Cadena& op2);
bool operator ==(const Cadena& op1, const Cadena& op2);
bool operator !=(const Cadena& op1, const Cadena& op2);
bool operator > (const Cadena& op1, const Cadena& op2);
bool operator >= (const Cadena& op1, const Cadena& op2);
bool operator < (const Cadena& op1, const Cadena& op2);
bool operator <= (const Cadena& op1, const Cadena& op2);

#endif


Muchas gracias por echarle un ojo!!
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Operador de conversion C++
« Respuesta #4 en: 17 Abril 2014, 14:05 pm »

Tienes errores ortográficos (Ej. "deplaza" en vez de "desplaza").
Algunas funciones del .cpp no concuerdan con el .h en cosas como el const, por ejemplo.

¿Compilas en Windows o en Unix?

Luego, pones cosas como "stricmp(op1, op2)". ¿Comparas chars con stricmp?

No se qué decir. Deberías replantearte muchas cosas. Ve reparando errores de las funciones 1 a 1.
« Última modificación: 17 Abril 2014, 14:08 pm por ivancea96 » En línea

xoker

Desconectado Desconectado

Mensajes: 24



Ver Perfil WWW
Re: Operador de conversion C++
« Respuesta #5 en: 17 Abril 2014, 15:54 pm »

Tienes errores ortográficos (Ej. "deplaza" en vez de "desplaza").
Algunas funciones del .cpp no concuerdan con el .h en cosas como el const, por ejemplo.

¿Compilas en Windows o en Unix?

Luego, pones cosas como "stricmp(op1, op2)". ¿Comparas chars con stricmp?

No se qué decir. Deberías replantearte muchas cosas. Ve reparando errores de las funciones 1 a 1.

Buenas tio, pues la verdad que me dejas peor de lo que empece, porque aunque no controlo C++ (soy de C y Java), creo que el .h corresponde con el .cpp, aunque claro que no pongo la mano en el fuego, podrias iluminarme? porque no veo lo que tratas de decirme.

Despues sobre el const, es totalmente cierto, no lo controlo, tanto es asi, que creo que el fallo del operador de conversion a char* tiene que venir de ahi, pero no consigo resolverlo. Podrias indicarme lo que ves mal en el codigo? Y si tienes la solucion para lo del operador de conversion char* te lo agradeceria mucho.

Por ultimo, sobre el usar stricmp para comparar caracteres, lo uso, porque tal como comente al principio estoy tratando de hacer una simulacion de la clase string de C++ y uso algunas funciones cuando puedo de la biblioteca string.h de C, si crees que hay una forma mas correcta soy todo oidos!!

Muchas gracias!!

EDITO: Compilo en windows con Dev C++



Zasca!! Me respongo a mi mismo! Encontrado el fallo del operador de conversion, resulta que la funcion strcpy recibe lo siguiente:

strcpy (char *op1, const char *op2); y donde me daba fallo era en op1 porque tenia un operador de conversion const char y no tenia el operador de conversion char... vergonzoso error que me traia de cabeza!!

Esto es lo que le ocurre cuando uno se adapta a lenguajes tan sencillos como Java  >:( >:(
« Última modificación: 17 Abril 2014, 16:32 pm por Eternal Idol » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Conversión . mov a .avi
Multimedia
Sakura85 1 2,566 Último mensaje 9 Junio 2004, 03:48 am
por Songoku
conversion de wmv a avi
Multimedia
Lemmy 1 2,014 Último mensaje 29 Junio 2005, 14:12 pm
por arda-lothi
¿Conversion &H?
Programación Visual Basic
DarkCompany96 2 2,624 Último mensaje 15 Abril 2012, 16:53 pm
por DarkCompany96
duda: funcionamiento operador unario de conversion de tipo
Programación C/C++
elkiy 5 2,939 Último mensaje 5 Octubre 2012, 17:48 pm
por elkiy
Problema operador asignación y operador asignación [struct] c++
Programación C/C++
luiggy2 2 3,046 Último mensaje 16 Octubre 2013, 23:35 pm
por luiggy2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines