c++

Post on 14-Mar-2016

36 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

C++. INF1761 - Computação Gráfica. Orientação por Objetos. Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento Objetos são um TAD: representação interna + conjunto de operações Variáveis da aplicação são objetos Classes são os tipos dos objetos - PowerPoint PPT Presentation

TRANSCRIPT

C++

INF1761 - Computação Gráfica

Orientação por Objetos

• Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento

• Objetos são um TAD: representação interna + conjunto de operações

• Variáveis da aplicação são objetos• Classes são os tipos dos objetos• Funções dos objetos são chamadas métodos

Classes em C++typedef struct { double xc, yc; double raio;} Circulo;

double area( Circulo e ){ return 3.14159 * e.raio * e.raio; }int interior( Circulo e, double x, double y) { … }

X

C

struct Circulo{ double xc, yc; double raio; double area() { return 3.14159 * raio * raio; } int interior(double x, double y) { … }};

C++

Objetos em C++

Circulo c;c.x = 3.2;c.y = 4.5;c.raio = 6.5;printf(“%d”, area( c ));if (interior( c, 9.5, 2 )) …

Circulo c;c.x = 3.2;c.y = 4.5;c.raio = 6.5;printf(“%d”, c.area());if (c.interior( 9.5, 2 )) …

C

C++

Encapsulamento

struct Classe { private: int c, b; public: int a, d; void set_c( int val ) { c = val; }};

Classe obj;obj.a = 1; // okobj.c = 0; // erro - campo c é privadoobj.set_c( 0 ); // agora sim

class Classe { int c, b; public: int a, d; void set_c( int val ) { c = val; }};

Declarações equivalentesclass: default é privatestruct: default é public

Construtores e Destrutores

class Classe{ public: Classe() { printf(“construtor\n”); } ~Classe() { printf(“destrutor\n”); }};

void f(){ Classe p1, p2; // p1 e p2 criados printf( “funcao f\n” ); // p1 e p2 destruídos}

construtorconstrutorfuncao fdestrutordestrutor

Execução de f

Métodos chamados implicitamente quando o objeto é criado e quando é destruído.

Construtores com parâmetros

class Circulo{ double xc, yc; double raio; public: Circulo( double x, double y, double r) { xc=x; yc=y; raio=r;} …};

Circulo c1( 3.2, 4.5, 9.0 ); // obriga a inicializaçãoCirculo c2; // erro, não tem construtor sem parâmetrosc1.xc = 4; // erro, campo xc é privado

Construtores podem ter parâmetros (destrutores não!). Além disso, uma classe pode ter mais de um construtor, desde que eles recebam parâmetros diferentes.

Alocação dinâmica

Circulo *c1, *c2;c1 = new Circulo; // cria um objeto da classe Circulo, // alocando memória e chamando o // construtor Circulo()c2 = new Circulo( 3.2, 4.5, 9.0 ); // cria outro, // agora com o outro construtor…delete c2; // destroi o objeto apontado por c2: // chama o destrutor e desaloca memóriadelete c1; // idem

class Circulo{ … public: Circulo(); Circulo( double x, double y, double r); ~Circulo();};

Herança

class CirculoColorido : public Circulo { int cor; public: CirculoColorido( double x, double y, double r, int c) : Circulo( x, y, r ) { cor = c; }

void troca_cor( int c ) { cor = c; }};

CirculoColorido c( 1.0, 3.4, 3.2, VERDE );c.troca_cor( AZUL );double a = c.area(); // ok, CirculoColorido tem tudo de Circulo

Herda da classe Circulo (classe base)

Inicializa a classe base antes de entrar no construtor

Representação dos objetos

double xcdouble ycdouble raio

Representação da classe Circulo

Circulo

double xcdouble ycdouble raio

int cor Declarado em CirculoColorido

Representação da classe Circulo

CirculoColoridoCirculoColorido*

Circulo*

Conversão de objetos

int intersecta( Circulo *c1, Circulo *c2 );

Circulo *c1, *c2;c1 = new Circulo(3, 4, 2);c2 = new Circulo(3.5, 3.3, 1 );

if (intersecta(c1, c2)) …

CirculoColorido *c3;c3 = new CirculoColorido( 2.5, 1, 3 );

if (intersecta(c1, c3)) …

Polimorfismoclass A { virtual void nome() { printf(“classe A\n”); }};class B : public A { virtual void nome() { printf(“classe B\n”); }};

A *pa; // ponteiros para objetos da classe AA* obj_a = new A; // cria objeto da classe AB* obj_b = new B; // cria objeto da classe B

pa = obj_a; // pa aponta para um objeto da classe Apa->nome(); // chama o metodo <nome> de A

pa = obj_b; // pa aponta para um objeto da classe Bpa->nome(); // chama o metodo <nome> de B!!!

Abstraindo as implementações dos objetos

class Objeto3D { public: virtual double intersecta( Raio r ) = 0; virtual Vetor3D normal( Vetor3D ponto ) = 0;};

rtColor trace ( rtRay ray, int depth){ determine a interseção mais próxima com um objeto if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( object, ray, intersection, normal, depth); } return BACKGROUND;}

Que métodos um objetoda cena precisa ter para

permitir a implementaçãodesta função?

Implementando a função traceObjeto3D* objetos[MAX_OBJETOS];int n_objetos;

Cor trace( Raio ray, int depth ){ int mais_proximo; double dist = -1; for (int i=0; i<n_objetos; i++) { double d = objetos[i]->intersecta(ray); if (d > 0 && (dist==-1 || d < dist)) { dist = d; mais_proximo = i; } } ...

rtColor trace ( rtRay ray, int depth){ determine a interseção mais próxima com um objeto ...

Implementando a função trace ... if (dist > 0) { Vetor3D ponto_de_inter = ray.ponto( dist ); Vetor3D normal = objetos[mais_proximo]->normal( ponto_de_inter); return shade(objetos[mais_proximo], ray, ponto, normal, depth ); } else { return BACKGROUND; }} ...

if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( object, ray, intersection, normal, depth); } return BACKGROUND;}

Referência de C++

The C++ Programming Language3a EdiçãoB. StroustrupAddison-Wesley, 1997

top related