13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!