Correcção do Teste

Exame - 14 de Setembro de 1999

Tecnologia Informática


Condições gerais da prova

Índice


Questões

1. Considere o seguinte programa:

#include <iostream.h>

class original
{
public:
    original()
    {
         cout << "Constructor original.\n";
     }
     virtual ~original()
     {
          cout << "Destructor original.\n";
     }
     virtual void escreve()
     {
          cout << "Escreve original.\n";
     }
};

main()
{
     original  *p1 = new original;
     original  *p2 = new derivada;
     derivada *p3 = new derivada;

     p1->escreve();
     p2->escreve();
     p3->escreve();

     delete p1;
     delete p2;
}


class derivada : public original
{
public:
     derivada()
     {
          cout << "Constructor derivada.\n";
     }
     virtual ~derivada ()
     {
          cout << "Destructor derivada.\n";
     }
     virtual void escreve()
     {
          cout << "Escreve derivada.\n";
     }
};

a) Indique todas as mensagens e por ordem, que o programa emite ao ser executado.

Resposta:

Constructor original.
Constructor original.
Constructor derivada.
Constructor original.
Constructor derivada.
Escreve original.
Escreve derivada.
Escreve derivada.
Destructor original.
Destructor derivada.

b) Quais as alterações às mensagens anteriores se a função void escreve() deixasse de ser virtual.

Resposta:

Constructor original.
Constructor original.
Constructor derivada.
Constructor original.
Constructor derivada.
Escreve original.
Escreve original. <<-- Única alteração
Escreve derivada.
Destructor original.
Destructor derivada.
Índice

2. Deseja-se representar formas geométricas bidimensionais. Estas formas são caracterizadas fundamentalmente por nº de vértices (int), padrão de preenchimento (string de tamanho variável) e cor (int).

a) Declare uma classe (CTeste) que modelize os objectos descritos, referindo os membros de dados, constructor cópia e destructor.

Resposta:

class CTeste
{
public:
	int vertices;
	char* padrao;
	int cor;
	CTeste(const CTeste& t)
	{
		vertices = t.vertices;
		padrao = (char*) new char[strlen(t.padrao)];
		strcpy(padrao, t.padrao);
		cor = t.cor;
	}
	~CTeste()
	{
		delete [] padrao;
	}
};

b) Implemente o operador ==(const CTeste&), que devolva 1 (verdadeiro) se os elementos forem equivalentes ou 0 (falso) se diferentes. Dois objectos CTeste são equivalentes se o nº de vértices, padrão e cor de cada um dos objectos forem iguais.

Resposta:

int CTeste::operator==(const CTeste& t)
{
	if (vertices == t.vertices && cor == t.cor
	    && strcmp(padrao, t.padrao) == 0 )
		return 1;
	else
		return 0;
}

c) Altere a declaração da classe, considerando que cada um dos vértices da figura é especificado pelo par (x, y) formando uma cadeia que varia de tamanho em função do nº de vértices. Pode supor a exitência da estrutura PONTO definida como:

struct PONTO
{
    int x;
    int y;
};

Resposta:

class CTeste
{
public:
	int vertices;
	char* padrao;
	int cor;
	PONTO *pontos;
	// continua ...
};

d) Implemente o constructor cópia, considerando as alterações referidas na alínea anterior.

Resposta:

CTeste(const CTeste& t)
{
	vertices = t.vertices;
	padrao = (char*) new char[strlen(t.padrao)];
	strcpy(padrao, t.padrao);
	cor = t.cor;
	pontos = (PONTO*) new PONTO[vertices];
	for(int i=0;i<vertices;i++)
	{
		pontos[i].x = t.pontos[i].x;
		pontos[i].y = t.pontos[i].y;
	}
};

Índice


Última actualização: 20-12-1999

Tecnologia Informática