Uma novidade muito simples e interessante no C++20 é a comparação ternária. Quem programa linguagem C já conhecia há muito tipo este tipo de comparação, mas em outro contexto de comparação. A novidade facilita muito em determinadas situações.
(mais…)Categoria: Programação C/C++
Apesar de não ser único das linguagens C e C++, a forma que a estrutura de controle de fluxo switch funciona é um pouco diferente de quando aprendemos algorítmos, ou quando aprendemos linguagens mais simples. Este post vai explicar como exatamente funciona o switch, e por que é necessário utilizar o break no switch? Será que é?
(mais…)O pattern Factory Methods é uma forma de encapsular o construtor de forma a tornar a criação de objetos muito mais flexível e acessível às classes derivadas. Basicamente é um método estático chamado no lugar no operador new para alocar uma nova instância da classe. Veja o exemplo a seguir:
#include <iostream>
#include <string>
class Part {
private:
protected:
std::string id;
Part() {
id = "";
std::cout << " -> New empty part constructor" << std::endl;
}
Part(std::string id) {
this->id = id;
std::cout << " -> New part constructor by id" << std::endl;
}
Part(std::string name, std::string instance, std::string rev) {
std::cout << " -> query for part on database" << std::endl;
std::cout << " -> New part construcutor by part data" << std::endl;
}
public:
~Part() {
std::cout << "-> Part destructor" << std::endl;
}
static Part* createPart() {
std::cout << "-> Execute checks and preparations for new empty part" << std::endl;
return new Part();
}
static Part* createPart(std::string id) {
std::cout << "-> Execute checks and preparations for new part by id" << std::endl;
return new Part(id);
}
static Part* createPart(std::string name, std::string instance, std::string rev) {
std::cout << "-> Execute checks and preparations for new part by part data" << std::endl;
return new Part(name, instance, rev);
}
};
int main() {
Part* first = Part::createPart();
Part* second = Part::createPart("0123456789ABCDEF");
Part* third = Part::createPart("Name", "1", "1");
delete first, second, third;
}
Neste exemplo o retorno para os objetos é em forma de ponteiros, mas é possível também ser feito por valor, ou referência, facilitando a gestão da memória.
Cuidados
Muito cuidado com a documentação de códigos deste tipo. É necessário deixar bem documentado a forma de desalocação dos objetos alocados, seja deixando a responsabilidade da desalocação (delete) pelo método que efetuou o chamado, ou por um método específico para isso (Part::destroyPart(), por exemplo).
Profissionalmente
Algumas equipes não aceitam a utilização do operador new, sendo obrigatório sempre haver um Factory Method, outras apenas incentivam quando há necessidade.
Quanto maior a complexidade de inicialização de um objeto, mais indicado é o Factory Method. Uma máquina de estados é um bom exemplo, ainda mais se os estados e suas conexões dependerem de uma fonte de dados externa, como um arquivo ou uma base de dados.
A partir desta semana vamos começar uma série de artigos sobre Design Patterns, snippets tão úteis como controversos. Apesar das críticas contrárias a sua utilização, sua importância é inegável, não apenas como uma biblioteca de padrões mas principalmente como uma forma de estudar diferentes abordagens a soluções comuns no dia-a-dia do desenvolvimento.
(mais…)Apesar de não ser muito comum utilizar linguagem C/C++ para a recuperação de dados na internet, às vezes é necessário, seja por questões de performance, de arquitetura, ou até mesmo requisitos de projeto. E nestes casos libcURL é a principal biblioteca para acesso a internet.
No exemplo de hoje será utilizado código em linguagem C, uma vez que devido a natureza da libcURL a conversão para C++ é relativamente simples.
(mais…)Há alguns meses apareceu na lista cppbrasil uma dúvida, como retornar o(s) caracteres do meio de uma string. Por exemplo:
- AMARELO -> R
- VERMELHO -> ME
- AZUL -> ZU
- VERDE -> R
Hoje uma nova seção no Lab C++. As sextas-feiras serão reservadas para solução de exercícios e problemas encontrados em provas, cursos técnicos, superior, concursos, entrevistas de emprego, etc. Esta seção é voltada para tirar dúvidas dos leitores, portanto envie suas dúvidas, suas sugestões. Todas vão entrar na fila, serão resolvidas e publicadas na sequência.
A solução de hoje um problema ao qual fui submetido recentemente. Um avaliador pediu pra eu fazer um programa que validasse a abertura e fechamento de parênteses, colchetes e chaves.
(mais…)Loop é uma construção básica em uma linguagem de programação estruturada, e o loop for uma das formas mais comuns. Em C++ temos 5 formas de implementar loops for.
(mais…)Arquivos .csv são muito utilizados para troca de dados, por conta da sua simplicidade de geração e interpretação. A rigor são linhas de texto com campos separadas por vírgulas (Comma-Separated Values – valores separados por vírgulas), mas é muito comum utilizar separação com ponto-e-vírgula.
(mais…)Design Patterns, ou Padrões de Projeto, são soluções gerais para problemas comuns de desenvolvimento de software, apesar de controversas são considerados um conjunto de melhores práticas. Um desses padrões é o Singleton, utilizado para garantir que somente haverá uma instância dessa classe no programa todo, sem impactar na facilidade de acesso a essa instância.
(mais…)