A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Curso C++ (J. Seixas) Primeiro exemplo: classe node Uma classe representando um ponto de uma rede (node) typedef long coord; typedef long seq; typedef.

Apresentações semelhantes


Apresentação em tema: "Curso C++ (J. Seixas) Primeiro exemplo: classe node Uma classe representando um ponto de uma rede (node) typedef long coord; typedef long seq; typedef."— Transcrição da apresentação:

1 Curso C++ (J. Seixas) Primeiro exemplo: classe node Uma classe representando um ponto de uma rede (node) typedef long coord; typedef long seq; typedef double dist; class row; class node { public: node(); node(coord x, coord y); dist getDistance(node myNode); dist getDistance(row myRow); coord getXCoord(); coord getYCoord(); private: coord xCoord; coord yCoord; }; Member functions Data members Acesso a todos Acesso só à classe Não esquecer o ;! Forward declaration Construtor

2 Curso C++ (J. Seixas) Primeiro exemplo: classe node Conteúdo do ficheiro node.cpp #include "node.h" using namespace std; node::node(){} node::node(coord x, coord y){ xCoord = x; yCoord = y; } coord node::getXCoord(){ return xCoord; } coord node::getYCoord(){ return yCoord; }

3 Curso C++ (J. Seixas) Primeiro exemplo: classe node A classe node tal como a conhecemos (com ligeiras alterações): #include using namespace std; typedef long coord; typedef long seq; typedef double dist; class row; class node { public: node(); node(coord x, coord y); dist getDistance(node& myNode); dist getDistance(row& myRow); coord getXCoord(); coord getYCoord(); void setXCoord( coord x ); void setYCoord( coord y ); void setCoordinates( coord x, coord y); private: coord xCoord; coord yCoord; };

4 Curso C++ (J. Seixas) Primeiro exemplo: classe row A classe row está relacionada com a classe node (row.h): #ifndef _ROW_H #define _ROW_H #include #include "node.h" using namespace std; class row { public: row(); row(node &basePoint, bool direction); dist getDistance(node &anotherNode); dist getDistance(row &anotherRow); node getIntersectionPoint(row &anotherRow); void setBasePoint(node &Point); void setDirection(bool Direction); bool getDirection(); node& getBasePoint(); static long numInstances; private: node basePoint; bool rowDirection; }; #endif/* _ROW_H */

5 Curso C++ (J. Seixas) A variável estática numInstances O objectivo desta variável é contar o número de objectos do tipo row criados. A variável tem pois de ser inicializada a 0 e o seu valor ser actualizado sempre que um novo objecto é criado. O qualificativo static implica que o valor desta variável é partilhado por todos estes objectos! A inicialização de numInstances só pode ser feita em row.cpp com long row::numInstances=0; A chamada a esta variável tem de ser feita de forma comum a todos os objectos do tipo row: row::numInstances

6 Curso C++ (J. Seixas) Primeiro exemplo: classe row Implementação da classe row (row.cpp): (Parte1) #include "node.h" #include "row.h" #include using namespace std; long row::numInstances=0; row::row(){ ++numInstances; } row::row(node &Point, bool Direction){ basePoint.setCoordinates(Point.getXCoord(),Point.getYCoord()); rowDirection=Direction; ++numInstances; } bool row::getDirection(){ return rowDirection; } node& row::getBasePoint(){ return basePoint; }

7 Curso C++ (J. Seixas) Primeiro exemplo: classe row Implementação da classe row (row.cpp): (Parte 2) void row::setBasePoint( node &Point ){ basePoint.setCoordinates(Point.getXCoord(),Point.getYCoord()); } void row::setDirection( bool Direction ){ rowDirection=Direction; } dist row::getDistance( node& anotherNode){ dist distance; if(rowDirection==0) distance=basePoint.getXCoord()-anotherNode.getXCoord(); else distance=basePoint.getYCoord()-anotherNode.getYCoord(); return distance; } dist row::getDistance( row& anotherRow){ dist distance; if(rowDirection==0) distance=basePoint.getXCoord()- anotherRow.getBasePoint().getXCoord(); else distance=basePoint.getYCoord()-anotherRow.getBasePoint().getYCoord(); return distance; }

8 Curso C++ (J. Seixas) Primeiro exemplo: classe row Implementação da classe row (row.cpp): (Parte 3) node row::getIntersectionPoint( row& anotherRow){ if(rowDirection==anotherRow.getDirection()) { cerr << "As linhas nao se cruzam!" << endl; exit(1); } node intersectionPoint(basePoint.getXCoord(), anotherRow.getBasePoint().getYCoord()); return intersectionPoint; }

9 Curso C++ (J. Seixas) Finalização da classe node Uma função ficou por implementar na classe node: a função getDistance. Na realidade, agora que já implementámos a classe row vamos alterar a definição desta função na classe node de forma a podermos utilizar a nossa definição: dist getDistance(row& myRow); dist node::getDistance(node &myNode){ return sqrt((xCoord-myNode.getXCoord())*(xCoord-myNode.getXCoord())+(yCoord- myNode.getYCoord())*(yCoord-myNode.getYCoord())); } dist node::getDistance(row &myRow){ return myRow.getDistance(*this); } Classe row Classe node

10 Curso C++ (J. Seixas) O ponteiro this A variável local this é definida automaticamente pelo C++ para cada função membro não-estática (aqui do tipo node* ) que aponta para o objecto usado para seleccionar a função membro. Portanto, se node1 é do tipo node: Ao avaliar node1.getDistance(row1), this aponta para node1 enquanto a função getDistance está a ser executada; Dentro de node::getDistance(row) a expressão myRow.getDistance(*this) chama a função membro getDistance do objecto myRow e passa o resultado a node1 como argumento. Parece complicado, mas na realidade não é: apenas requer algum treino…

11 Curso C++ (J. Seixas) Exemplo de programa de teste #include #include "node.h" #include "row.h" using namespace std; int main(int argc, char *argv[]) { node origin(0,0); coord x,y,w,z; seq Nx, Ny; cout << "Introduza as coordenadas do nodo 1: "; cin >> x >> y; node point2D1; point2D1.setXCoord(x); point2D1.setYCoord(y); cout << "Introduza as coordenadas do nodo 2: "; cin >> w >> z; node point2D2; point2D2.setCoordinates(w,z); cout << "Coordenada x do nodo 1: " << point2D1.getXCoord() << endl; cout << "Coordenada y do nodo 1: " << point2D1.getYCoord() << endl; cout << "Coordenada x do nodo 2: " << point2D2.getXCoord() << endl; cout << "Coordenada y do nodo 2: " << point2D2.getYCoord() << endl; row Line1(point2D1, 0); row Line2(point2D2, 1); cout << "Direccao da linha 1: " << Line1.getDirection() << endl; cout << "Ponto base da linha 2: (" << Line2.getBasePoint().getXCoord() << ", " << Line2.getBasePoint().getYCoord() << ")" << endl; cout << "Numero de Instancias: " << row::numInstances << endl; node intersectionPoint=Line1.getIntersectionPoint(Line2); cout << "Ponto de interseccao da linha1 com linha2: (" << intersectionPoint.getXCoord() << ", " << intersectionPoint.getYCoord() << ")" << endl; cout << "Distancia do ponto 1 a linha 2: " << point2D1.getDistance(Line2) << endl; return 0; }

12 Curso C++ (J. Seixas) Exemplo de programa de teste Resultado:


Carregar ppt "Curso C++ (J. Seixas) Primeiro exemplo: classe node Uma classe representando um ponto de uma rede (node) typedef long coord; typedef long seq; typedef."

Apresentações semelhantes


Anúncios Google