Operador de conversion C++

Iniciado por xoker, 16 Abril 2014, 19:02 PM

0 Miembros y 1 Visitante están viendo este tema.

xoker

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:



//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!!

ivancea96

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.

amchacon

O haz un cast explícito:
Código (cpp) [Seleccionar]
Cadena::operator const char*() const{
return (const char*) _palabra;
}
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

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:

#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:

#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!!

ivancea96

#4
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.

xoker

#5
Cita de: ivancea96 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.

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  >:( >:(