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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 217 — #255<br />

✐<br />

7.5. Elección <strong>en</strong>tre sobrecarga y argum<strong>en</strong>tos por defecto<br />

después del constructor por defecto), la nueva porción de más se pone a cero utilizando<br />

la función de la librería estándar de C memset(), que fue pres<strong>en</strong>tada <strong>en</strong> el<br />

Capítulo 5. La sigui<strong>en</strong>te llamada es a la función de la librería estándar de C memcpy(),<br />

que <strong>en</strong> este caso copia los octetos exist<strong>en</strong>tes de mem a newmem (normalm<strong>en</strong>te<br />

de una manera eficaz). Finalm<strong>en</strong>te, se libera la memoria antigua y se asignan a los<br />

atributos apropiados la nueva memoria y su tamaño.<br />

La clase Mem se ha diseñado para su utilización como herrami<strong>en</strong>ta d<strong>en</strong>tro de otras<br />

clases para simplificar su gestión de la memoria (también se podría utilizar para<br />

ocultar un sistema de gestión de memoria más avanzada proporcionado, por ejemplo,<br />

por el el sistema operativo). Esta clase se comprueba aquí con una simple clase<br />

de tipo string:<br />

//: C07:MemTest.cpp<br />

// Testing the Mem class<br />

//{L} Mem<br />

#include "Mem.h"<br />

#include <br />

#include <br />

using namespace std;<br />

class MyString {<br />

Mem* buf;<br />

public:<br />

MyString();<br />

MyString(char* str);<br />

~MyString();<br />

void concat(char* str);<br />

void print(ostream& os);<br />

};<br />

MyString::MyString() { buf = 0; }<br />

MyString::MyString(char* str) {<br />

buf = new Mem(strl<strong>en</strong>(str) + 1);<br />

strcpy((char*)buf->pointer(), str);<br />

}<br />

void MyString::concat(char* str) {<br />

if(!buf) buf = new Mem;<br />

strcat((char*)buf->pointer(<br />

buf->msize() + strl<strong>en</strong>(str) + 1), str);<br />

}<br />

void MyString::print(ostream& os) {<br />

if(!buf) return;<br />

os pointer()

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

Saved successfully!

Ooh no, something went wrong!