Escolar Documentos
Profissional Documentos
Cultura Documentos
Macros
Macros
Macros
Portanto, este código acima será enviado da seguinte forma para ser compilado:
int vetor[1024];
Macros
Outro exemplo:
#define PI 3.141592653589793238461024
circunferenciaCirc = 2*PI*raio
areaCirc = PI*(r*r)
Macros
A diretiva #define também pode ser usada para criar funções macro.
#define QUADRADO(x) ((x)*(x))
Macros
Macros podem ter mais de um parâmetro.
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
Macros
Poddemos usar macros para definir condições de compilação.
#include <iostream>
using namespace std;
#define PI 3.14159265359
int main() {
#ifdef DEBUG
cout << "Estamos no modo DEBUG" << endl;
#endif
#ifdef VERBOSE_LEVEL
#if VERBOSE_LEVEL == 1
cout << "Currently running with verbose level: " << VERBOSE_LEVEL << endl;
cout << PI << endl;
#endif
#if VERBOSE_LEVEL == 2
cout << "Currently running with verbose level: " << VERBOSE_LEVEL << endl;
cout << PI << endl;
cout << "Mais informações." << endl;
#endif
#else
cout << "Tchau." << endl;
#endif
return 0;
}
Macros
Macros podem ser usadas para gerar código repetitivo ou para criar construções
específicas.
#include <iostream>
using namespace std;
#define DECLARACAO_GETTER_SETTER(type, var) \
type get_##var() const { return var; } \
void set_##var(type valor) { var = valor; }
class ClasseExemplo {
private:
int minhaVariavel;
public:
DECLARACAO_GETTER_SETTER(int, minhaVariavel)
};
int main() {
ClasseExemplo m;
m.set_minhaVariavel(12);
cout << m.get_minhaVariavel();
}
No entanto, é importante usar macros com cautela, pois elas podem levar a
problemas de legibilidade e manutenção se usadas em excesso.
Em muitos casos, as funções inline, constantes const, e outros recursos da
linguagem C++ moderna podem ser preferíveis às macros.
Prof. Bruno Azevedo Programação Orientada a Objetos
Programação Orientada a Objetos Macros Templates
Templates
Templates
Templates
Exemplo:
#include <iostream>
using namespace std;
template <typename T>
T quadrado(T a) {
return a ∗ a;
}
int main() {
int resultadoInteiro = quadrado(12);
double resultadoDouble = quadrado(5.9);
cout << resultadoInteiro << ", " << resultadoDouble; // 144, 34.81
return 0;
}
Templates
Templates
Exemplo:
#include <iostream>
using namespace std;
template <typename Tipo>
class MinhaClasse {
private:
Tipo varInt;
public:
MinhaClasse(Tipo varInt):varInt(varInt) {}
Tipo getvarInt() {
return this->varInt;
}
void setvarInt(Tipo var) {
this->varInt = varInt;
}
};
int main() {
MinhaClasse <int> obj(37);
cout << obj.getvarInt();
return 0;
}
Templates
Templates
#include <iostream>
using namespace std;
template <typename TipoElemento, int tamanhoPilha>
class Pilha {
private:
TipoElemento elementos[tamanhoPilha];
int topo;
public:
Pilha() : topo(−1) {}
bool push(TipoElemento valor) {
if(topo < tamanhoPilha − 1) {
elementos[++topo] = valor;
return true; }
else {
cerr << "Erro: Stack Overflow, não é possível adicionar mais elementos.\n";
return false; }
}
TipoElemento pop() {
if (topo >= 0)
return elementos[topo−−];
else {
cerr << "Erro: Stack Underflow, não é possível remover elementos.\n";
return 0; }
}
};
int main() {
Pilha<int, 200> stack;
stack.push(50);
cout << stack.pop();
return 0;
}
Templates
Templates podem possuir valores padrão para os parâmetros.
#include <iostream>
using namespace std;
template <typename Tipo = int, int ValorPadrao = 26>
class MinhaClasse {
private:
Tipo var;
public:
MinhaClasse(Tipo valor = ValorPadrao):var(valor) {}
void imprimirVar() {
cout << "Var: " << var << endl;
}
};
int main() {
MinhaClasse<int,36> obj1;
MinhaClasse<> obj2;
obj1.imprimirVar(); // 36
obj2.imprimirVar(); // 26
return 0;
}
Templates – Especialização
Templates – Especialização
Templates – Especialização
Templates – Especialização
#include <iostream>
#include <string>
using namespace std;
// Classe geral
template <typename Tipo>
class Quadrado {
public:
Tipo calculaQuadrado(Tipo valor) {
return valor ∗ valor;
}
};
// Especialização para strings
template <>
class Quadrado<string> {
public:
string calculaQuadrado(string valor) {
return valor + valor; // Concatenação das strings
}
};
int main() {
Quadrado <int> quadradoInt; // Com inteiros
cout << quadradoInt.calculaQuadrado(12) << endl;
Quadrado <string> quadradoString; // Com strings
cout << quadradoString.calculaQuadrado("OrientaçãoObjeto") << endl;
return 0;
}
Prof. Bruno Azevedo Programação Orientada a Objetos
Programação Orientada a Objetos Macros Templates
Implemente uma função de template que recebe dois parâmetros por referência
e troca seus valores. Teste a função com inteiros, doubles e chars.
Implemente uma função de template que aceita um vetor e seu tamanho como
argumentos e retorna o maior elemento do vetor. Teste a função com diferentes
tipos de dados.
Implemente uma classe de fila genérica usando templates. Teste a classe com
diferentes tipos de dados.
Implemente uma classe de lista duplamente encadeada usando templates. Inclua
operações comuns para essa estrutura de dados. Teste a classe com diferentes
tipos de dados.
Implemente uma classe de template que realiza a conversão entre dois tipos de
dados distintos. A classe deve ter um método que aceita um valor do tipo
original e o converte para o tipo alvo. A versão genérica do método deve apenas
exibir “Conversão não implementada”, já que cada conversão deve ser
implementada separadamente. Forneça uma especialização para a conversão de
string para int e teste no main().