Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 216 — #254<br />
✐<br />
Capítulo 7. Sobrecarga de funciones y argum<strong>en</strong>tos por defecto<br />
El objeto Mem conti<strong>en</strong>e un bloque de octetos y se asegura de que ti<strong>en</strong>e sufici<strong>en</strong>te<br />
memoria. El constructor por defecto no reserva memoria pero el segundo constructor<br />
se asegura de que hay sz octetos de memoria <strong>en</strong> el objeto Mem. El destructor libera<br />
la memoria, msize() le dice cuántos octetos hay actualm<strong>en</strong>te <strong>en</strong> Mem y pointer()<br />
retorna un puntero al principio de la memoria reservada (Mem es una herrami<strong>en</strong>ta a<br />
bastante bajo nivel). Hay una versión sobrecargada de pointer() que los programadores<br />
cli<strong>en</strong>tes pued<strong>en</strong> utilizar para obt<strong>en</strong>er un puntero que apunta a un bloque<br />
de memoria con al m<strong>en</strong>os el tamaño minSize, y el método lo asegura.<br />
El constructor y el método pointer() utilizan el método privado <strong>en</strong>sureMin-<br />
Size() para increm<strong>en</strong>tar el tamaño del bloque de memoria (note que no es seguro<br />
mant<strong>en</strong>er el valor de retorno de pointer() si se cambia el tamaño del bloque de<br />
memoria).<br />
He aquí la implem<strong>en</strong>tación de la clase:<br />
//: C07:Mem.cpp {O}<br />
#include "Mem.h"<br />
#include <br />
using namespace std;<br />
Mem::Mem() { mem = 0; size = 0; }<br />
Mem::Mem(int sz) {<br />
mem = 0;<br />
size = 0;<br />
<strong>en</strong>sureMinSize(sz);<br />
}<br />
Mem::~Mem() { delete []mem; }<br />
int Mem::msize() { return size; }<br />
void Mem::<strong>en</strong>sureMinSize(int minSize) {<br />
if(size < minSize) {<br />
byte* newmem = new byte[minSize];<br />
memset(newmem + size, 0, minSize - size);<br />
memcpy(newmem, mem, size);<br />
delete []mem;<br />
mem = newmem;<br />
size = minSize;<br />
}<br />
}<br />
byte* Mem::pointer() { return mem; }<br />
byte* Mem::pointer(int minSize) {<br />
<strong>en</strong>sureMinSize(minSize);<br />
return mem;<br />
} ///:~<br />
Puede observar que <strong>en</strong>sureMinSize() es la única función responsable de reservar<br />
memoria y que la utilizan tanto el segundo constructor como la segunda versión<br />
sobrecargada de pointer(). D<strong>en</strong>tro de <strong>en</strong>sureSize() no se hace nada si el<br />
tamaño es lo sufici<strong>en</strong>tem<strong>en</strong>te grande. Si se ha de reservar más memoria para que el<br />
bloque sea más grande (que es el mismo caso cuando el bloque ti<strong>en</strong>e tamaño cero<br />
216<br />
✐<br />
✐<br />
✐<br />
✐