C++: duda sintaxis constructor

Jimmy
31 de Octubre del 2003
Hola que tal, queria preguntaros una duda que me ha surgido con un constructor. Yo normalmente tengo por costumbre crear el nuevo objeto con un operador new, de esta manera:

CFileDialog *dlgArchivoEntrada= new CFileDialog(TRUE,NULL,NULL,OFN_EXPLORER,"Archivos RAW (*.RAW)|*.RAW||" );

Asi, luego utilizo el operador flecha para acceder a los metodos,ya que trabajo con un puntero al objeto,de esta manera:

dlgArchivoEntrada->DoModal()

Pues bien, hoy nos ha dado el profesor un fragmento de código equivalente al anterior en que el constructor viene definido asi:

CFileDialog dlgArchivoEntrada(TRUE,NULL,NULL,OFN_EXPLORER,"Archivos RAW (*.RAW)|*.RAW||" );

Y luego para acceder a los metodos, utiliza el operador punto

dlgArchivoEntrada.DoModal();

Que tiene de especial esta otra forma??Ya no declaramos un puntero al objeto?por que no utiliza new?, que alguien me lo aclare por favor :)

ivan
31 de Octubre del 2003
La diferencia es simple, con el puntero se utiliza una variable indirecta. El uso del operador fecha es con el fin de decir: "el componente, no este elemento, sino el objeto al que apunta" es decir, es una desreferencia doble.

La flecha equivale a:

(*p).method()

que como dije es igual a:

p->method()

Ahora, si no se usa un puntero, no tiene sentido decir que hay que "desrefenciar" dos veces. Basta con una.

p.method()

simplemente y no mas.

¿Cual metodo es mejor?

La escogencia de uno u otro depende de quien y cuando se destruya el objeto.

Si un objeto es creado con new, debe ser eliminado por el programador explicitamente. Pero si es creado como variable local, automaticamente, al llegar al final del bloque, se ejecutara el destructor del objeto.

Tipicamente, es bueno que el objeto se destruya automaticamente, ya que reduce la carga de trabajo del programador y disminuye los errores, sobre todo los errores de desperdiciar memoria al no liberar los objetos creados con new.

De hecho, y esto para finalizar, existen librerias destinadas a permitir que un objeto creado con new sea liberado como un objeto local. Así se usaria el operador flecha pero se obtendria la ventaja de la sencillez del metodo de variables locales. Pero todas estas librerias son mas complejas que simplemente usar un objeto local.

Jimmy
31 de Octubre del 2003
muchas gracias ya me ha quedado todo mas claro :)