#include <string.h> #include <stdlib.h> #include <stdio.h> #include "Pen.h" struct pen { const char* _brand; const char* _color; }; Pen newPen(const char *brand, const char *color) { Pen pen = (Pen)malloc(sizeof(struct pen)); pen->_brand = brand; pen->_color = color; return pen; } void deletePen(Pen pen) { if (pen) free(pen); } void writePen(Pen pen, const char *msg) { printf("(%s) %s\n", pen->_color, msg); } const char *getBrandPen(Pen pen) { return pen->_brand; } const char *getColorPen(Pen pen) { return pen->_color; } /* note that we require pen1 and pen2 to be valid pens: any of them being NULL pointers will result in a false comparison. */ int equalsPen(Pen pen1, Pen pen2) { if (pen1 == NULL || pen2 == NULL) return 0; return !strcmp(getBrandPen(pen1), getBrandPen(pen2)) && !strcmp(getColorPen(pen1), getColorPen(pen2)); } void printPen(Pen pen) { printf("== Pen ==\n"); printf("Brand: %s\n", getBrandPen(pen)); printf("Color: %s\n", getColorPen(pen)); }
Note-se que a função de criação de uma caneta está simplificada. Deveria ser alocado espaço em memória para guardar duas novas cadeias de caracteres para guardar a marca e cor da caneta, em vez de estarmos simplesmente a reutilizar as cadeias de caracteres recebidas como argumento. Esta solução tem a desvantagem de possibilitar fugas de memória dado que não se sabe quando é que se pode libertar a memória associada à marca e cor de uma caneta a destruir.