Ir ao conteúdo
  • Cadastre-se

C++ Por que isso ocorre quando altero o código?


ROR

Posts recomendados

Eu tenho um código na main que funciona normalmente. Esse código diz que o usuário deverá informar os dados e  pede que o usuário digite o nome do funcionário e a instrução seguinte inicia o objeto i1. O objeto i1 chama seu construtor e o restante do código segue até o programa (na main) solicitar que o usuário digite o CPF do funcionário e a instrução seguinte inicia o objeto i1. O que eu não entendo é o que acontece quando eu altero o código da main. Quando eu insiro 4 linhas antes da linha que diz que o usuário deverá informar os dados, solicitando que o usuário informe quantos funcionários serão cadastrados, declaro uma variável quantidade, leio a variável quantidade informada pelo usuário e imprimo o valor da variável quantidade, o programa chega a imprimir que o usuário deverá informar os dados e pede que o usuário digite o nome do funcionário mas então o cursor já vai para a linha onde o usuário deve informar o CPF não permitindo que ele digite o nome do funcionário. Por que isso acontece?

//código da main que não está funcionando corretamente
int main()
{
	ofstream saidaArquivoCadastro( "cadastro.dat", ios::out );
	
	if ( !saidaArquivoCadastro ) // operador ! sobrecarregado
 {
 cerr << "Arquivo nao pode ser aberto" << endl;
 exit( 1 );
 }
 
	cout << "Informe a quantidade de funcionarios a serem cadastrados: ";
	int quantidade;
	cin >> quantidade;
	cout << quantidade;
	cout << "\nInforme os dados: \n\n";
	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;

//código da main que está funcionando corretamente
int main()
{
	ofstream saidaArquivoCadastro( "cadastro.dat", ios::out );
	
	if ( !saidaArquivoCadastro ) // operador ! sobrecarregado
 {
 cerr << "Arquivo nao pode ser aberto" << endl;
 exit( 1 );
 }
 
	
	cout << "\nInforme os dados: \n\n";
	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;

//descrição da classe info
#include <string>
using std::string;

#ifndef INFO_H
#define INFO_H

class info
{
	public:
		info (string = "");
		void setInfoDado (string);
		void setInfo ();
		void print () const;
	private:
		string infoDado;
};

#endif
  
  //descrição dos métodos info
  #include <iostream>
using std::cout;
using std::cin;

#include <string>
using std::string;
using std::getline;

#include "info.h"

info::info (string info)
{
	setInfoDado (info);
}

void info::setInfoDado (string info)
{
	infoDado = info;
	setInfo();
}

void info::setInfo ()
{
	string nome;
	getline (cin, nome);
	infoDado = nome;
}

void info::print () const
{
	cout << infoDado << "\n";
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Como disse, não manjo de c++ mas vou dar um exemplo em c.

 

Citação

#include <stdio.h>

int main()
{
    char teste1[2];
    char teste2[2];
    
    scanf("%c", teste1);
    // setbuf(stdin, NULL);
    scanf("%c", teste2);
    
    printf("FIM");
    return 0;
}

 

Execute com o setbuf comentado e ensira algum dado, voce vai perceber que ele vai "pular" o segundo scanf (por causa do buff do teclado) ai setando o buff para NULL o enter que você deu no primeiro scanf não vai para o segundo, entende?

Link para o comentário
Compartilhar em outros sites

 

 

Sobre esse trecho:

 

	cout << "\nInforme os dados: \n\n";
	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;

 

Posicionar as declarações para usar os construtores como se fossem mecanismos de leitura não é boa ideia. Não vai ganhar nada com isso. 

Você pode declarar vários construtores --- polimorfismo --- e um deles pode simplesmente ser programado para usar um prompt e ler o valor do teclado. Uma linha só. Pode usar o prompt como argumento por exemplo
 

2 horas atrás, ROR disse:

com um endl no final das instruções?

 

std::endl atua em cout, saída.

 

 

 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, ROR disse:

cout << "Informe a quantidade de funcionarios a serem cadastrados: ";

int quantidade;

cin >> quantidade;

cout << quantidade;

Percebi que esse problema acontece apenas quando eu coloco a instrução cin >> quantidade;. Quando eu não coloco essa instrução o cursor para em cout << "Nome do funcionario: "; para que eu possa digitar o nome do usuário (uma vez que ao instanciar o objeto i1  o método da classe info 

 

3 horas atrás, ROR disse:

void info::setInfo ()

faz com que o programa espere o usuário digitar o nome). Quando eu coloco a instrução cin >> quantidade; algo faz com que esse método ou a instrução de atribuição no escopo desse método não seja executada. O interessante é que quando o objeto i2 é instanciado o código funciona normalmente (com ou sem a instrução cin >> quantidade; antes do objeto i1).

 

36 minutos atrás, arfneto disse:

Posicionar as declarações para usar os construtores como se fossem mecanismos de leitura não é boa ideia. Não vai ganhar nada com isso. 

Eu usei o construtor tanto para instanciar os atributos dos objetos como também para ler o que o usuário digitar.

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, ROR disse:

Eu usei o construtor tanto para instanciar os atributos dos objetos como também para ler o que o usuário digitar

Então use em seu programa assim. Não precisa do prompt para ler e de posicionar a declaração depois do cout. Pense nisso.

 

Quer ver um exemplo?

Poste um código compilável que eu possa usar para te mostrar

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, arfneto disse:

 Sim. A versão de main que não funciona. a classe e o header são os mesmos ainda?

As classes e cabeçalhos são os mesmos mas estou mandando o código todo aqui.

//main
#include <iostream>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::ios;

#include <fstream> 
using std::ofstream;

#include <cstdlib>
using std::exit;

#include "trabalhador.h"

int main()
{
	ofstream saidaArquivoCadastro( "cadastro.dat", ios::out );
	
	if ( !saidaArquivoCadastro ) // operador ! sobrecarregado
 {
 cerr << "Arquivo nao pode ser aberto" << endl;
 exit( 1 );
 }
 
	cout << "Informe a quantidade de funcionarios a serem cadastrados: ";
	int quantidade;
	cin >> quantidade;
	cout << quantidade;
	cout << "\nInforme os dados: \n";
	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;
	cout << "\nNome da mae: ";
	familia f1;
	cout << "\nNome do pai: ";
	familia f2;
	trabalhador t(i1, i2, f1, f2);
	
	return 0;
}
  
  //trabalhador.h
  #ifndef TRABALHADOR_H
#define TRABALHADOR_H

#include "info.h"
#include "familia.h"

class trabalhador
{
	public:
		trabalhador (const info &, const info &, const familia &, const familia &);
		void print () const;
	private:
		const info funcionarioNome;
		const info funcionarioCPF;
		const familia mae;
		const familia pai;
};

#endif
  
  //trabalhador.cpp
  #include <iostream>
using std::cout;

#include "trabalhador.h"
#include "info.h"

trabalhador::trabalhador (const info &infoNome, const info &infoCPF,
const familia &famiMae, const familia &famiPai)
:funcionarioNome (infoNome),
funcionarioCPF (infoCPF),
mae (famiMae),
pai (famiPai)
{
	cout << "\nDados do funcionario: \n";
	print();
}

void trabalhador::print() const
{
	funcionarioNome.print();
	funcionarioCPF.print();
	mae.print();
	pai.print();
}

  //info.h
  #include <string>
using std::string;

#ifndef INFO_H
#define INFO_H

class info
{
	public:
		info (string = "");
		void setInfoDado (string);
		void setInfo ();
		void print () const;
	private:
		string infoDado;
};

#endif
  
  //info.cpp
  #include <iostream>
using std::cout;
using std::cin;

#include <string>
using std::string;
using std::getline;

#include "info.h"

info::info (string info)
{
	setInfoDado (info);
}

void info::setInfoDado (string info)
{
	infoDado = info;
	setInfo();
}

void info::setInfo ()
{
	string nome;
	getline (cin, nome);
	infoDado = nome;
}

void info::print () const
{
	cout << infoDado << "\n";
}
  
  //familia.h
  #include <string>
using std::string;

#ifndef FAMILIA_H
#define FAMILIA_H

class familia
{
	public:
		familia (string = "");
		void setFamiDado (string);
		void setFami ();
		void print () const;
	private:
		string famiDado;
};

#endif
  
  //familia.cpp
  #include <iostream>
using std::cout;
using std::cin;

#include <string>
using std::string;
using std::getline;

#include "familia.h"

familia::familia (string info)
{
	setFamiDado (info);
}

void familia::setFamiDado (string info)
{
	famiDado = info;
	setFami();
}

void familia::setFami ()
{
	string nome;
	getline (cin, nome);
	famiDado = nome;
}

void familia::print () const
{
	cout << famiDado << "\n";
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Acho que não entendo o que quer fazer, a lógica no geral. Tem 3 classes com um único campo e quer usar várias instâncias como por exemplo uma info para ter o funcionário e outra para o CPF. Mas porque não declarar os campos apenas?

 

E a classe info
 

	info(string = "");

 

que significa isso?

 

info::info(string info)
{
	setInfoDado(info);
}

void info::setInfoDado(string info)
{
	infoDado = info;
	setInfo();
}

 

E esse trecho? 

 

O construtor recebe uma string, que é passada para setInfoDado() que coloca em info. Só que aí chama setInfo():
 

void info::setInfo()
{
	cout << "Nome: ";
	string nome;
	getline(cin, nome);
	infoDado = nome;
}

 

Que destrói esse valor e troca pelo que foi lido.

 

E se as classes info só são usadas dentro de trabalhador porque não define internamente? E se elas só tem uma string porque existem?

E como os métodos estão dentro das classes não precisa escrever nomes diferentes por um prefixo. Podem ter o mesmo nome.

 

Link para o comentário
Compartilhar em outros sites

36 minutos atrás, arfneto disse:

Tem 3 classes com um único campo e quer usar várias instâncias como por exemplo uma info para ter o funcionário e outra para o CPF.

Isso. Eu tenho "vários" objetos diferentes da mesma classe que representam atributos diferentes apesar de usar a mesma variável pra isso.

 

39 minutos atrás, arfneto disse:

Mas porque não declarar os campos apenas?

Eu poderia fazer isso também mas preferi optar por usar objetos diferentes da mesma classe. No caso da classe info por exemplo, eu poderia ter um atributo nome e um atributo cpf mas acabei optando por objetos diferentes para representar atributos com cada objeto com um único atributo (isso é só um escopo, um esqueleto... depois eu posso alterar e aumentar as classes)

 

53 minutos atrás, arfneto disse:

info(string = "");

Um construtor padrão apenas para instanciar o atributo.

1 hora atrás, arfneto disse:

cout << "Nome: ";

Se eu colocar essa instrução eu precisarei alterar a descrição dos métodos (incluir métodos, inserir chamadas na main já que eu precisaria ter uma para o cpf também).

56 minutos atrás, arfneto disse:

info::info(string info) { setInfoDado(info); } void info::setInfoDado(string info) { infoDado = info; setInfo(); }

Construtor para instanciar o atributo do objeto e garantir que ele esteja em um estado consistente.

 

1 hora atrás, arfneto disse:

E se as classes info só são usadas dentro de trabalhador porque não define internamente? E se elas só tem uma string porque existem?

Eu quero trabalhar o conceito da composição.

Link para o comentário
Compartilhar em outros sites

8 horas atrás, ROR disse:

Um construtor padrão apenas para instanciar o atributo

Esta errado. Que atributo seria esse?

 

8 horas atrás, ROR disse:

Se eu colocar essa instrução eu precisarei alterar a descrição dos métodos (incluir métodos, inserir chamadas na main já que eu precisaria ter uma para o cpf também)

 

Não faz muita diferença se for o prompt apenas e ele está solto em main() tornando o programa impossível de ler sem a implementação das classes, o que não é nada bom.

 

8 horas atrás, ROR disse:

Construtor para instanciar o atributo do objeto e garantir que ele esteja em um estado consistente

 

Isso não é um construtor e a garantia de nada srve, já que vai reatribuir o valor do único campo a partir de um getline()

 

8 horas atrás, ROR disse:

Eu quero trabalhar o conceito da composição

 

Tem muitas maneiras de fazer isso. Podia usar inner classes, herança, polimorfismo para os construtores. 

 

Do modo como fez não está bom e não vai aprender muito a partir desse programa. E está errado. Chamar os construtores das classes internas direto no construtor de trabalhador também não é boa ideia: pouco flexível.

 

Veja a saída

 

Citação

Nome: um nome
CPF: 345.
um nome
345.
mae: mae
pai: pai do 345
mae
pai do 345
criando o trabalhador

Dados do funcionario:
um nome
345.
mae
pai do 345

 

deste program, que é o seu programa
 

Citação


int main(void)
{
    info i1("Nome");
    info i2("CPF");
    i1.print();
    i2.print();

    familia f1("mae");
    familia f2("pai");
    f1.print();
    f2.print();

    cout << "criando o trabalhador\n";
    trabalhador t1(i1, i2, f1, f2);
}

 

O software do forum ainda não se recuperou da "migração". Mais uma vez desapareceram botões da interface

 

Pode ler o programa aqui. Não vou postar porque alguns botões da interface do forum não aparecendo...

 

De todo modo veja uma classe info
 

Citação

class info
{
public:

    info() : Dado(""){};
    info(string prompt) { setDado(prompt); };
    void setDado(string);
    void print() const;

private:

    string Dado;
};

 

É o mais comum. E funciona. Preste atenção ao modo certo de inicializar variáveis. E ao polimorfismo.

 

E setDado() pode ser a mesma que em familia
 

Citação

void info::setDado(string prompt)
{
    cout << prompt << ": ";
    getline(cin, Dado);
}
 

 

E veja em main() os dois construtores em uso. 

 

Entende as diferenças?

Link para o comentário
Compartilhar em outros sites

2 horas atrás, arfneto disse:

Esta errado. Que atributo seria esse?

O atributo infoDado.

 

2 horas atrás, arfneto disse:

Não faz muita diferença se for o prompt apenas e ele está solto em main() tornando o programa impossível de ler sem a implementação das classes, o que não é nada bom.

Como assim?

 

2 horas atrás, arfneto disse:

Isso não é um construtor e a garantia de nada srve, já que vai reatribuir o valor do único campo a partir de um getline()

Eu uso o construtor para chamar setInfoDado e através dele iniciar o atributo (mesmo que depois eu vá reatribuir outro valor).

 

2 horas atrás, arfneto disse:

Tem muitas maneiras de fazer isso. Podia usar inner classes, herança, polimorfismo para os construtores. 

Eu ainda não cheguei a estudar herança e polimorfismo, por isso eu quero usar apenas composição que é a parte que eu já cheguei pra fazer o que eu preciso fazer (mesmo que seja mais complicado, demorado e ineficiente...) À medida que eu for estudando os próximos conteúdos eu vou aprimorando o código.

 

2 horas atrás, arfneto disse:

Do modo como fez não está bom e não vai aprender muito a partir desse programa. E está errado. Chamar os construtores das classes internas direto no construtor de trabalhador também não é boa ideia: pouco flexível.

No livro do Deitel que eu estou usando como referência ele apresenta um exemplo dessa forma. Mas isso na parte da composição, que é o que eu estou lendo até agora... pode ser que nos outros temas ele apresente exemplos de outras formas. Mas eu gostaria de fazer assim primeiro para ganhar mais "experiência" no que eu já estudei para depois passar para os próximos conteúdos.

 

2 horas atrás, arfneto disse:

É o mais comum. E funciona. Preste atenção ao modo certo de inicializar variáveis. E ao polimorfismo.

O problema é que eu não entendi as duas primeiras linhas depois do public porque eu ainda não estudei a parte do polimorfismo... por isso eu gostaria de fazer sem usar polimorfismo e herança (por mais ineficiente que o código seja) apenas para aprofundar mais no conhecimento que eu já aprendi e saber o que é possível fazer com o que eu já sei (mesmo de forma ineficiente) e o que não é possível fazer com o que eu já sei

 

2 horas atrás, arfneto disse:

E veja em main() os dois construtores em uso. 

como assim?

Link para o comentário
Compartilhar em outros sites

4 horas atrás, ROR disse:
7 horas atrás, arfneto disse:

Esta errado. Que atributo seria esse?

O atributo infoDado.

 

 

Bem, só poderia ser esse já que é o único na verdade. Só que está errado. Como eu te disse duas vezes já


De novo, de seu código:
 

class info
{
public:
	info(string = "");
	void setInfoDado(string);
	void setInfo();
	void print() const;
private:
	string infoDado;
};


E
 

class familia
{
public:
	familia(string = "");
	void setFamiDado(string);
	void setFami();
	void print() const;
private:
	string famiDado;
};

 

Isso que escreveu aí é um construtor. O segundo construtor para a classe info ou familia. O primeiro é o construtor padrão, info() ou familia(). E veja o argumento que você usou
 

    info(string = "");

 

string é uma classe, "" é uma constante, um string literal. Nem sei porque isso compila, mas não sei o que significa. Aí não há referência a nenhum atributo. Nada significa e nada faz. Vai passar uma string vazia para o construtor padrão de string e o resultado disso para o construtor padrão de info. E o resultado será NADA.

 

E quando você escreve 
 

	trabalhador t(i1, i2, f1, f2);

 

em main() está chamando o construtor padrão, para as duas classes. E não esse que você escreveu com o parâmetro que nada significa. Por isso seu programa não lê nada. Está só errado. 
 

4 horas atrás, ROR disse:
7 horas atrás, arfneto disse:

Não faz muita diferença se for o prompt apenas e ele está solto em main() tornando o programa impossível de ler sem a implementação das classes, o que não é nada bom.

Como assim?

 

Veja seu programa
 

	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;
	cout << "\nNome da mae: ";
	familia f1;
	cout << "\nNome do pai: ";
	familia f2;
	trabalhador t(i1, i2, f1, f2);

 

Escreveu isso na talvez ingênua hipótese de que ao ler info xxx ou familia yyy o sistema fosse chamar aqueles construtores que escreveu. Só que não vai. Como de fato não fez. Essa é a razão de você ter aberto esse tópico.

 

O sistema vai rodar os cout e os construtores padrão, implícitos já que não se deu ao trabalho de escrever nenhum.


Suas palavras
 

23 horas atrás, ROR disse:

o programa chega a imprimir que o usuário deverá informar os dados e pede que o usuário digite o nome do funcionário mas então o cursor já vai para a linha onde o usuário deve informar o CPF não permitindo que ele digite o nome do funcionário. Por que isso acontece?


Escreva um construtor, com uma única linha, um
 

cout << "o cara do forum tem razao!\n";


e veja o que sai na tela;)

 

4 horas atrás, ROR disse:

Eu uso o construtor para chamar setInfoDado e através dele iniciar o atributo (mesmo que depois eu vá reatribuir outro valor)

 

Pois é. Um longo caminho para lugar algum:

 

Começa com a declaração de info por exemplo
 

class info
{
public:
	info(string = "");

 

Esse código nada significa, como já disse. Está errado. Você provavelmente queria escrever 

 

class info
{
public:
	info(string);

 

Mas acabou surtindo um efeito: o compilar vai procurar por uma implementação desse construtor e de fato você escreveu uma:
 

info::info (string info)
{
	setInfoDado (info);
}

 

Só que não vai ser usada nunca e eu expliquei acima porque: ao declarar do modo como fez vai char apenas o construtor padrão. Mas se fosse chamar esse ai acabaria em 
 

void info::setInfoDado (string info)
{
	infoDado = info;
	setInfo();
}

 

Que colocaria o valor do argumento em infoDado, a única variável de sua classe. E aí chamaria setInfo() que claro não poderia Set coisa alguma já que infoDado, repito, é a única variável da classe:
 

void info::setInfo ()
{
	string nome;
	getline (cin, nome);
	infoDado = nome;
}

 

Pois é: setInfo() lê um novo valor para infoDado. E aí vem a pergunta: para que ficar definindo valores para essa variável toda hora, definir um construtor e mais duas funções, para fazer só isso: Ir lá e ler um novo valor? Apender "composição de classes"? 

 

E tudo começou por, no caso de info como usou em main().

 

Citação

E claro, se você não tiver em mãos o código para o construtor de info nunca vai entender que esse cout abaixo é apenas um prompt para um getline() que vai ser chamado em uma função que já recebeu esse nome como parâmetro, de uma função que já recebeu esse nome como parâmetro do construtor da classe. E foi o que você de fato escreveu. 

	cout << "Nome do funcionario: ";
	info i1;
	cout << "\nCPF: ";
	info i2;

 

Eis o que você queria fazer:
 

class info
{
public:

	info() : Dado(""){};
	info(string prompt) { setDado(prompt); };
	void setDado(string);
	void print() const;

private:

	string Dado;
};

 

E

 

void info::setDado(string prompt)
{
	cout << prompt << ": ";
	getline(cin, Dado);
}

 

E na declaração:
 

	info i1("Nome");
	info i2("CPF");


E na hora de rodar:


image.png.6443f934daed4f0a2a5e91389b6ffab2.png

 

4 horas atrás, ROR disse:
7 horas atrás, arfneto disse:

Do modo como fez não está bom e não vai aprender muito a partir desse programa. E está errado. Chamar os construtores das classes internas direto no construtor de trabalhador também não é boa ideia: pouco flexível.

No livro do Deitel que eu estou usando como referência ele apresenta um exemplo dessa forma. Mas isso na parte da composição, que é o que eu estou lendo até agora... pode ser que nos outros temas ele apresente exemplos de outras formas. Mas eu gostaria de fazer assim primeiro para ganhar mais "experiência" no que eu já estudei para depois passar para os próximos conteúdos.

 

Pois é. Não conheço esse livro então não vi o exemplo, mas pode ser só um exemplo b3st@ ou um momento ruim do livro. 

 

Leu o que te escrevi e o seu código como eu postei? no link que te mandei ontem? lá está corrgido e tem uma versão melhor de "composição", um nome chique para uma coisa óbvia.

 

E por falar em um nome chique para uma coisa óbvia, polimorfismo é um caso desses. Trata-se apenas do fato de que em C++ --- a partir de uma frustração do prof. Bjarne por não poder fazer isso em C e ser possível em outras linguagens da época (final dos anos 70) --- é possível declarar várias funções com o mesmo nome, desde que tenham argumentos diferentes (Bjarne Stroustrup escreveu a linguagem C++).

 

Eis o que acontece no seu programa:

ao você declarar
 

	cout << "Nome do funcionario: ";
	info i1;

 

vai chamar o construtor padrão de info. Que você não escreveu. Escreveu um construtor (errado) que usa um parâmetro string, mas acho que queria mesmo era escrever
 

    info() : Dado(""){};


e aí acho que até teria funcionado seu programa, apesar de ser uma maneira muito ruim de escrever o que você queria. E de não te ensinar nada. Exceto talvez pelo que estou te explicando agora de novo, e ontem.

 

4 horas atrás, ROR disse:

O problema é que eu não entendi as duas primeiras linhas depois do public porque eu ainda não estudei a parte do polimorfismo... por isso eu gostaria de fazer sem usar polimorfismo e herança (por mais ineficiente que o código seja) apenas para aprofundar mais no conhecimento que eu já aprendi e saber o que é possível fazer com o que eu já sei (mesmo de forma ineficiente) e o que não é possível fazer com o que eu já sei

 

Ninguém vai te culpar por ler as próximas páginas do livro. Apesar de que pela sequência normal de apresentar essas coisas acho que já deve ter lido sobre o tal polimorfismo quando o livro te mostrou que pode ter vários construtores para uma classe. Se não viu isso antes de composição talvez deva mudar de livro.

 

Cansei de escrever...
 

Sugiro que leia o programa cujo link deixei ontem. Hoje os botões estão de volta ao forum mas não vou copiar de novo.

 

Se não leu ontem, eis uma composição normal de classes para algo como o que tentou escrever:


class Documento
{
public:
	Documento() {};
	~Documento() {};
private:
	string    numero;
	string    emissao;
};

class Local
{
public:
	Local() {};
	~Local() {};
private:
	string    nome;
	string    rua;
	string    complemento;
	string    gps;
};

class Pessoa
{
public:
	Pessoa() {};
	~Pessoa() {};
private:
	string    nome;
	Local     endereco;
	string    telefone;
};

class _Trabalhador
{
public:
	_Trabalhador() {};
	~_Trabalhador() {};
private:
	Pessoa    nome;
	Documento CNH;
	Documento RG;
	Documento passaporte;

	Local     endereco;
};

 

Não escrevi código para as classes do exemplo. Acho que não vai acrescentar nada e não tenho tempo agora.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...