Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SubAtomicParticula en 2 Agosto 2017, 11:05 am



Título: Sobrecargar Operador por defecto de una clase
Publicado por: SubAtomicParticula en 2 Agosto 2017, 11:05 am
Saludos, quisiera saber si existe un operador por defecto en una clase c++ y si se puede sobrecargar.

Lo que tengo es una clase Cadena que almacena un array char *texto, declarado privado.

Pero cuando necesito usar ese texto en una función típica de API de Win32 necesito pasar el puntero al array como es lógico y para ello uso el operador(), pero no me parece elegante, ejemplo:

Cadena Titulo("Hola");
SetWindowText(hWnd,Titulo());

Quisiera conseguir esto:

Cadena Titulo("Hola");
SetWindowText(hWnd,Titulo);

Puede que haya que sobrecargar el Operador= pero no se como diferenciarlo del operador de asignación que ya está sobrecargado.

Gracias, un saludo.


Título: Re: Sobrecargar Operador por defecto de una clase
Publicado por: ivancea96 en 2 Agosto 2017, 12:55 pm
Tienes operadores para convertir tipos. Su declaración es:
Código
  1. operator <tipo>();
  2. operator int();

Aquí es importante ver la importancia de la palabra "explicit":
Código
  1. explicit operator int();

Con explicit, solo podrás hacer la conversión haciendo un cast manualmente (por ejemplo, (int)a)

Un ejemplo de todo esto:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. class A {
  7. public:
  8.    operator int(){
  9.        return 1;
  10.    }
  11.  
  12.    explicit operator const char*(){
  13.        return "_1";
  14.    }
  15. };
  16.  
  17. int main(){
  18.    A a;
  19.  
  20.    int n = a;
  21.  
  22.    const char* c = (const char*)a;
  23.  
  24.    cout << a << c << endl;
  25. }

De todos modos, cuidado con implementar estos operadores sin la palabra explicit. En caso de errores o confusiones, estos operadores pueden ocultar el error. Por ejemplo:
Código
  1. class A {
  2. public:
  3.    operator int*(){
  4.        return nullptr;
  5.    }
  6. };
  7.  
  8. int main(){
  9.    A a;
  10.  
  11.    void* n = &a;
  12.    void* m = a; // Nos hemos olvidado el ampersand, y como la conversión de int* a void* es implícita también, no da problema.
  13. }


Siempre que implementes estos operadores, suele ser buena idea proveer además un método "normal" de conversión, tipo "getCString()"


Título: Re: Sobrecargar Operador por defecto de una clase
Publicado por: SubAtomicParticula en 2 Agosto 2017, 21:12 pm
Muchas gracias, me sirve para lo que quería.

Un saludo.