Saltar para o conteúdo

De Objective Caml para C e C++/Introdução à programação orientada a objetos

Origem: Wikilivros, livros abertos por um mundo aberto.

Basicamente, a Programação Orientada a Objetos (POO) consiste em imaginar os problemas em pequenos pedaços, que funcionam separadamente, mas como parte de um todo. Cada pedaço é chamado objeto, e ele possui métodos(coisas que ele pode fazer, ou "habilidades") e atributos(propriedades que ele possui, ou "características").

Para deixar isso claro, vamos imaginar uma simulação virtual de uma casa. O que uma casa faz, e o que uma casa contém? Na nossa "Casa padrão", teremos a habilidade de deixar pessoas entrarem, e as características serão os cômodos, portas e janelas da nossa casa. É uma casinha bem simples.

Com isso, temos nossa casa... ou não, por que ainda não dissemos ao computador o que é uma porta, nem janela, nem comodo!

Esse tipo de situação é bastante frequente na Programação Orientada a Objetos. É que objetos criados por você se utilizem de outros objetos. Uma vantagem disso, é que esses outros objetos não precisam ser criados por você: Uma das vantagens da POO é a reutilização de código, que poupa trabalho ao programador, deixando tempo livre para que ele se dedique ao que realmente importa no seu problema. Se você estivesse projetando uma casa de verdade, o que faria: Fabricaria suas próprias portas e janelas, ou compraria elas prontas?

Nessa logica, vamos deixar a programação da janela e da porta para um terceiro. Assumindo elas prontas, vamos apenas se utilizar delas.

As classes ("matéria-prima dos objetos") podem se associar a outras classes de duas formas: Associação Simples (ou "Usa um", porque um objeto dessa classe contêm um objeto da outra), ou Herança (ou "É um", pois um objeto dessa classe também é um objeto da outra).

Um exemplo obvio de Associação Simples são as janelas; o objeto "Janela lateral" é um objeto da classe Janela, e faz parte da casa. Não existem grandes problemas aqui, então passemos para o próximo tópico.

Agora, vamos para os cômodos.

Vamos colocar uma casa bem pequena, com uma sala, dois quartos, uma cozinha e um banheiro. Eu poderia criar a classe sala, a classe quarto e a classe cozinha individualmente, certo? De fato, isso funciona. Não existe nada que me obrigue a se utilizar de heranças, mas elas são bastante uteis pelo seguinte caso:

Imagine a classe sala. Ela possui um conjunto de luminárias, uma área, um conjunto de objetos, e compartilha a porta e certas janelas da casa. A classe Quarto tem um conjunto de luminárias, uma área, um conjunto de objetos, a cama, e compartilha certas janelas da casa. A classe Cozinha tem um conjunto de luminárias, uma área, um conjunto de objetos, e compartilha certas janelas da casa. A classe Banheiro tem um conjunto de luminárias, uma área, um conjunto de objetos, e compartilha certas janelas da casa.

Essa repetição proposital serve para demonstrar o principal motivo de usar heranças: Evitar repetição. Todos os cômodos, se fossem criados separadamente, teriam que ter seus próprios métodos para cuidar de suas coisas. ou seja, você teria que digitar novamente o mesmo código, com pequenas variações as vezes. Criar uma classe Comodo, que contem as luzes, a área, os objetos e as janelas diminui bastante o trabalho do programador. Pode parecer tentador usar Ctrl+c e Ctrl+v, mas as vezes copiar tudo faz com que você crie erros indesejáveis. É bom dominar as técnicas básicas primeiro, para depois se utilizar de facilidades.

Para se criar uma classe em c++ pode se seguir o seguinte protótipo:

class NOME {
   public :
    PARTE1
   private :
    PARTE2
 }

Onde NOME corresponde ao nome da classe a ser feita e PARTE1 e PARTE2 correspondem a funções e/ou variáveis. A diferença da PARTE1 para a PARTE2 é essencialmente onde eles estão porque as funções e/ou variáveis que estiverem no public serão as variáveis e/ou funções que todos terão acesso e no private apenas quem terá acesso são as funções da própria classe por exemplo:

 class seq {
  public :
   seq ();
   void guardar (int a);
   int retirar ();
   int mostrar ();
  private :
   int i;
   int* v;
 };

Isso é um exemplo do protótipo de uma classe chamada seq que guarda até cinco inteiros e os insere e remove como uma pilha a seguir um modelo de uma implementação.

 seq :: seq () {
  v = new int v[5];
  i = 0;
  }
 void seq :: guardar (int a) {
   v[i] = a;
   ++i;
  }
 int seq :: retirar () {
  if (i)
   --i;
  return v[i];
  }
 int seq :: mostrar () {
  int tmp = i;
  if (i)
   tmp = i-1;
  return v[tmp];
  }
  • em construção