c++

16

Click here to load reader

Upload: beau-malone

Post on 14-Mar-2016

36 views

Category:

Documents


0 download

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

Page 1: C++

C++

INF1761 - Computação Gráfica

Page 2: C++

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

Page 3: C++

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

Page 4: 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++

Page 5: 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

Page 6: C++

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.

Page 7: C++

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.

Page 8: C++

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();};

Page 9: C++

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

Page 10: C++

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*

Page 11: C++

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)) …

Page 12: C++

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

Page 13: C++

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?

Page 14: C++

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

Page 15: C++

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;}

Page 16: C++

Referência de C++

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