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 Windows

Quantidade 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 Windows

Quantidade 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 índice

Quantidade 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 
Cada número da série é a soma dos dois números anteriores. A linha de baixo reflete o índice do número. Assim, quando falamos "O quinto número de Fibonacci", nós estamos nos referindo ao índice 4, ou seja, o valor 3.

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
}
Sua saída deverá ser parecida com:
Informe o índice: 6
O número de Fibonacci no índice informado é: 8

Resposta/Solução:

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

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware 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 funcionalidadesControle 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
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 26 usuários muito felizes estudando em nosso site.