Você está aqui: C++ ::: Dicas & Truques ::: Programação Orientada a Objetos |
Definindo e usando variáveis estáticas em suas classes C++Quantidade de visualizações: 10677 vezes |
Variáveis estáticas podem ser definidas em C++ por meio do uso da palavra-chave static. Uma variável estática pertence à classe na qual ela é definida e não à cada uma de suas instâncias. Pareceu confuso? Você pode pensar assim: quando definida com o modificador static, uma variável será única na classe, não importa a quantidade de instâncias da classe que serão criadas. Cada uma destas instâncias compartilhará o valor da variável estática. Além disso, uma variável estática pode ser acessada por meio do nome da classe, sem a necessidade de uma referência a uma de suas instâncias. Uma variável estática pode ser public, private ou protected. Vamos ver um exemplo? Considere a situação na qual gostaríamos de criar um identificador único para cada um dos objetos de uma classe. Vamos começar com o arquivo de definição da classe Livro: Código para Livro.h ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- // vamos evitar múltiplas inclusões do // arquivo de cabeçalho (header file) #ifndef LIVRO_H #define LIVRO_H // vamos incluir o header string #include <string> using namespace std; class Livro{ public: // construtor da classe Livro Livro(); // método que permite retornar o título do livro string getTitulo(); // método que permite definir o título do livro void setTitulo(string); // método que permite retornar o identificador do livro int getId(); private: // variáveis privadas string titulo; // variável estática que permitirá definir um // identificador único para cada livro static int id; }; #endif Aqui a variável estática id é declarada como private. Como nossa intenção é usá-la como identificador único de instâncias, obtemos seu valor por meio do método público getId(). Veja agora o arquivo de implementação para esta classe: Código para Livro.cpp: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- // arquivo de implementação para a // classe Livro // vamos incluir o header Livro.h #include "Livro.h" // vamos declarar e inicializar a variável estática int Livro::id = 0; // implementação do construtor Livro::Livro(){ // vamos incrementar a variável estática Livro::id++; } // método que permite obter o título do livro string Livro::getTitulo(){ return this->titulo; } // método que permite definir o título do livro void Livro::setTitulo(string titulo){ this->titulo = titulo; } // método que permite obter o título do livro int Livro::getId(){ return Livro::id; } O primeiro detalhe a observar no código de implementação da classe Livro é a linha: int Livro::id = 0; O compilador C++ nos força a fazer esta declaração e inicialização de variáveis estáticas. Note o uso do nome da classe seguida por um par de dois pontos (::). Para finalizar, veja como criar três objetos da classe Livro a partir da função main() da aplicação: Código para main.cpp: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <cstdlib> #include <iostream> // vamos incluir a classe Livro #include "Livro.h" using namespace std; int main(int argc, char *argv[]) { // vamos criar um objeto da classe Livro Livro *a = new Livro(); a->setTitulo("Programando em Java 2"); // vamos exibir os dados do livro cout << "Id: " << a->getId() << endl; cout << "Titulo: " << a->getTitulo() << endl; // vamos criar mais um livro Livro *b = new Livro(); b->setTitulo("A biblia do C/C++"); // vamos exibir os dados do livro cout << "Id: " << b->getId() << endl; cout << "Titulo: " << b->getTitulo() << endl; // e mais um livro aqui Livro *c = new Livro(); c->setTitulo("PHP + MySQL"); // vamos exibir os dados do livro cout << "Id: " << c->getId() << endl; cout << "Titulo: " << c->getTitulo() << endl; system("PAUSE"); return EXIT_SUCCESS; } Ao executar esta aplicação teremos o seguinte resultado: Id: 1 Titulo: Programando em Java 2 Id: 2 Titulo: A biblia do C/C++ Id: 3 Titulo: PHP + MySQL Como podemos ver, a cada instância criada a variável id é incrementada em 1. Caso você não tenha entendido todo o processo, este incremento acontece no construtor da classe Livro. Veja: // vamos incrementar a variável estática Livro::id++; Nas situações em que as variáveis estáticas são públicas, podemos acessá-la usando o nome da classe e um par de dois pontos (::). Assim, se a variável id fosse pública, poderíamos acessá-la de qualquer lugar de nossa aplicação da seguinte forma: cout << Livro::id << endl; |
Link para compartilhar na Internet ou com seus amigos: |
C++ ::: Win32 API (Windows API) ::: Edit Control |
Como definir a cor de fundo para um Edit Control em tempo de execução usando C++ e a API do WindowsQuantidade de visualizações: 10159 vezes |
O processo de definir a cor de fundo para um Edit Control em tempo de execução usando apenas C++ e a API do Windows é um pouco complicado. A técnica apresentada aqui pode não ser a mais eficiente, mas funciona mesmo (testado como VC++ 2005 e Windows XP). Note que estarei usando as funções CreateSolidBrush(), GetDlgCtrlID(), SetBkMode() e SetBkColor() da WinAPI. 1 - Comece adicionando as linhas na parte de variáveis globais de sua aplicação: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- HBRUSH hbrushEditBox = CreateSolidBrush(RGB(255, 255, 255)); HDC hdcEdit; int id_edit_control; HWND edit_window; 2 - Modifique ou adicione um case para a mensagem WM_CTLCOLOREDIT da seguinte forma: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- case WM_CTLCOLOREDIT: hdcEdit = (HDC)wParam; edit_window = HWND(lParam); id_edit_control = GetDlgCtrlID(edit_window); if(id_edit_control == IDC_EDIT1){ SetBkMode(hdcEdit, TRANSPARENT); SetBkColor(hdcEdit,(LONG)hbrushEditBox); return (LONG)hbrushEditBox; } return (LRESULT)CreateSolidBrush(RGB(255, 255, 255)); 3 - A cor de fundo do Edit Control com ID IDC_EDIT1 será modificada para vermelho quando clicarmos no botão com o ID IDC_BUTTON1. Veja o case para este botão (dentro do case WM_COMMAND): ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- case IDC_BUTTON1: // ID do botão // Define uma nova cor de fundo para o Edit Control // com o ID IDC_EDIT1 // Vermelho como cor de fundo hbrushEditBox = CreateSolidBrush(RGB(255, 0, 0)); // Atualiza o Edit Control InvalidateRect(GetDlgItem(hwnd, IDC_EDIT1), 0, TRUE); break; |
C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios |
Arquivos e diretórios em C++ - Como escrever em arquivos usando a função WriteFile() da API do WindowsQuantidade de visualizações: 9037 vezes |
A função WriteFile() da Win32 API é útil quando precisamos escrever em arquivos. Esta função foi projetada para escritas síncronas e assíncronas, enquanto WriteFileEx() é somente para escritas assíncronas. Veja o protótipo desta função: BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); Antes de escrevermos em um arquivo, é importante entendermos o significado dos parâmetros da função WriteFile(): a) HANDLE hFile - Este é o handle para o arquivo no qual queremos escrever. Este handle deve ser criado com os direitos de acesso de escrita GENERIC_WRITE. b) LPCVOID lpBuffer - Um ponteiro para o buffer que contém os dados que serão escritos no arquivo. c) DWORD nNumberOfBytesToWrite - O número de bytes a serem escritos no arquivo. d) LPDWORD lpNumberOfBytesWritten - Um ponteiro para uma variável que receberá o número de bytes escritos. A função WriteFile() define o valor desta variável como zero antes de fazer seu trabalho ou verificação de erro. d) LPOVERLAPPED lpOverlapped - Um ponteiro para um estrutura OVERLAPPED. Esta estrutura é exigida se o handle para o arquivo for obtido usando FILE_FLAG_OVERLAPPED para o parâmetro dwFlagsAndAttributes da função CreateFile(). Geralmente usamos NULL para este parâmetro. Veja um trecho de código no qual usamos a função WriteFile() para escrever duas linhas em um arquivo texto: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]){ // dados a serem escritos no arquivo CHAR frase[80]; DWORD nOut; // bytes escritos // nome do arquivo CHAR arquivo[] = "C:\\testes.txt"; // vamos abrir o arquivo para escrita. // se o arquivo não existir nós vamos criá-lo. HANDLE hArquivo = CreateFile(arquivo, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hArquivo == INVALID_HANDLE_VALUE){ cout << "Erro ao abrir o arquivo: " << GetLastError() << endl; } else{ // arquivo aberto com sucesso. Vamos escrever // dados a serem escritos no arquivo CHAR frase1[80] = "Programar em C++ é bom demais\r\n"; CHAR frase2[80] = "E a Win32 é da hora!!!!"; DWORD nOut; // bytes escritos // vamos escrever a primeira frase WriteFile(hArquivo, frase1, strlen(frase1), &nOut, NULL); cout << nOut << " bytes foram escritos. " << endl; // vamos escrever a segunda frase WriteFile(hArquivo, frase2, strlen(frase2), &nOut, NULL); cout << nOut << " bytes foram escritos. " << endl; } // vamos fechar o handle CloseHandle(hArquivo); system("PAUSE"); return EXIT_SUCCESS; } |
C++ ::: Desafios e Lista de Exercícios Resolvidos ::: Recursão (Recursividade) |
Exercício Resolvido de C++ - Um método recursivo que calcula o número de Fibonacci para um dado índiceQuantidade de visualizações: 612 vezes |
Pergunta/Tarefa: Observe a série de números Fibonacci abaixo: Série: 0 1 1 2 3 5 8 13 21 34 55 89 Índice: 0 1 2 3 4 5 6 7 8 9 10 11 Este algoritmo consiste em, dado um determinado índice, retornar o número de Fibonacci correspondente. Recursivamente, o cálculo pode ser feito da seguinte forma: fib(0) = 0; fib(1) = 1; fib(indice) = fib(indice - 2) + fib(indice - 1); sendo o indice >= 2 Os casos nos quais os índices são 0 ou 1 são os casos bases (aqueles que indicam que a recursividade deve parar). Seu método deverá possuir a seguinte assinatura: int fibonacci(int indice){ // sua implementação aqui } Informe o índice: 6 O número de Fibonacci no índice informado é: 8 Veja a resolução comentada deste exercício usando C++: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- #include <string> #include <iostream> using namespace std; // assinatura da função recursiva int fibonacci(int indice); int main(int argc, char *argv[]){ // variáveis usadas na resolução do problema int indice; // vamos solicitar o índice do número de Fibonacci cout << "Informe o índice: "; // lê o índice cin >> indice; // calcula o número de Fibonacci no índice informado cout << "O número de Fibonacci no índice informado é: " << fibonacci(indice) << endl; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } // função recursiva que o número de Fibonacci em um determinado índice int fibonacci(int indice){ if(indice == 0){ // caso base; interrompe a recursividade return 0; } else if(indice == 1){ // caso base; interrompe a recursividade return 1; } else{ // efetua uma nova chamada recursiva return fibonacci(indice - 1) + fibonacci(indice - 2); } } |
Vamos testar seus conhecimentos em AutoCAD Civil 3D |
COGO Points no AutoCAD Civil 3D Qual parâmetro do COGO point é controlado pela configuração Point Identity na barra de ferramentas Create Points? A) Point location (Localização do ponto) B) Point name (Nome do ponto) C) Point description (Descrição do ponto) D) Point number (Número de ponto) Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Engenharia Civil - Instalações Hidráulicas Prediais |
Instalações prediais de combate a incêndio A norma NBR 13714 estabelece os critérios mínimos exigíveis para sistemas de hidrantes e de mangotinhos, para uso exclusivo no combate a incêndio. Com base nesses critérios, assinale a alternativa correta: A) Uma edificação com área de 850m2 não necessita de um sistema de mangotinhos ou de hidrantes para proteção contra incêndio. B) O ponto de tomada de água para hidrantes e mangotinhos pode ser instalado a até 10m de distância das portas externas e escadas. C) Os hidrantes devem ser distribuídos de tal forma que qualquer ponto da área a ser protegida seja alcançado por no mínimo dois esguichos. D) Uma edificação com parede externa de 12m de altura necessita que o hidrante externo seja instalado afastado no máximo 18m da edificação. E) Uma edificação com parede externa de 12m de altura necessita que o ponto de tomada de água seja instalado a no máximo 2m em relação ao piso. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Ética e Legislação Profissional |
Introdução à Ética Santo Agostinho foi um dos mais influentes pensadores cristãos da antiguidade, e abordava em suas obras questões éticas baseadas na compreensão da natureza da ética e sua ligação com a religião. Os textos de Santo Agostinho buscavam conciliar a filosofia greco-romana e os princípios do cristianismo, oferecendo uma leitura racionalizada da religião, sem descaracterizar a ideia de sobrenatural e de fé. Suas reflexões sobre o livre-arbítrio, a existência e a percepção do mal e a busca pela virtude pelos humanos foram base para reflexões filosóficas do iluminismo à contemporaneidade. Considerando essas informações, qual dos seguintes temas éticos direciona as reflexões de Santo Agostinho? A) Hedonismo: defesa da busca pelo prazer como o caminho para a realização pessoal. B) Utilitarismo: escolha de ações pela felicidade geral, na maior porcentagem possível. C) Virtude: defesa da virtude como uma forma de aproximação do fiel à Deus. D) Existencialismo: compreensão da natureza da existência humana. E) Niilismo: questionamento da legitimidade de valores morais em contextos mundanos. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em Fundações |
Fundações profundas Fundações profundas podem ser classificadas de diferentes maneiras. Uma forma de distinguir os diferentes tipos de estaca é pelo material empregado em sua composição. Com base no exposto, assinale com V (verdadeiro) ou F (falso) as proposições a seguir, sobre estacas de madeira. ( ) A madeira em contato com o oxigênio do ar tende a apresentar fungos que inibem a deterioração do material. ( ) As estacas de madeira apodrecem rapidamente se mantidas permanentemente debaixo d'água. ( ) No Brasil, estacas de madeira são amplamente utilizadas de forma permanente em obras comerciais e residenciais. Assinale a alternativa que indica, de cima para baixo, a ordem correta. A) V, F, F. B) V, V, V. C) F, F, F. D) F, F, V. E) V, V, F. Verificar Resposta Estudar Cards Todas as Questões |
Vamos testar seus conhecimentos em |
Dimensionamento de pilares intermediários Pilares são classificados conforme suas solicitações iniciais e sua esbeltez, e esses fatores são considerados na etapa de dimensionamento e detalhamento. O índice de esbeltez dos pilares é uma medida mecânica que permite determinar a facilidade de um determinado pilar em se encurvar. Você é um engenheiro civil que foi convidado para dar uma palestra sobre projeto estrutural de pilares de concreto armado. Na sessão das perguntas, um participante apontou três dúvidas: I. No pilar intermediário, devido à continuidade de vigas e lajes sobre o pilar, os momentos fletores de 1ª ordem são nulos apenas na direção x. II. Se o pilar for quadrado, deve existir pelo menos uma barra em cada vértice. III. O índice de esbeltez não depende do formato da área da seção transversal do pilar. É correto o que se afirma em: A) I, apenas. B) II, apenas. C) III, apenas. D) I e II, apenas. E) II e III, apenas. Verificar Resposta Estudar Cards Todas as Questões |
Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de C++ |
Veja mais Dicas e truques de C++ |
Dicas e truques de outras linguagens |
Códigos Fonte |
Software de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |