Lab C++

Codificação Eficiente

Não basta conhecer a sintaxe, é preciso conhecer a linguagem, saber a melhor forma de fazer.

Categoria: Programação C/C++

C++20: Comparação Ternária

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

Pra Que Usar break no switch?

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

Design Patterns: Factory Methods

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.

Design Patterns: Uma Nova Série de Artigos

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

Recuperar Dados da Internet com libcURL

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

Solução: Imprimir o Meio da String

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

Solução: Abertura e Fechamento de Parênteses

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

4 Formas de Loops For em C++

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

Parser .csv em C e C++

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 Pattern: Singleton

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