Sobrecargar Operador por defecto de una clase

Iniciado por SubAtomicParticula, 2 Agosto 2017, 11:05 AM

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

SubAtomicParticula

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.

ivancea96

#1
Tienes operadores para convertir tipos. Su declaración es:
Código (cpp) [Seleccionar]
operator <tipo>();
operator int();


Aquí es importante ver la importancia de la palabra "explicit":
Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
#include <iostream>

using namespace std;


class A {
public:
   operator int(){
       return 1;
   }

   explicit operator const char*(){
       return "_1";
   }
};

int main(){
   A a;

   int n = a;

   const char* c = (const char*)a;
   
   cout << a << c << endl;
}


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 (cpp) [Seleccionar]
class A {
public:
   operator int*(){
       return nullptr;
   }
};

int main(){
   A a;

   void* n = &a;
   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.
}



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

SubAtomicParticula

Muchas gracias, me sirve para lo que quería.

Un saludo.