Aplicação em C++ ( Trabalhando com Classes/Objectos )

PaNcRoNi

What is folding?
Boas pessoal,

estou aqui com um problema, a aplicação é simples e tem como funcionalidade, gerir o seguinte:

  • Funcionários (Nome, Número de Identificação na Empresa);
  • Directores (Nome, Número de Identificação na Empresa, Departamento);
  • Visitantes (Nome, Número de Bilhete de Identidade);

Parte do código onde existe o erro:

PHP:
int tratandoFuncionario(int tipoDeAccao)
{
    Pessoa p("");
    Funcionario f(0);
    
        if( tipoDeAccao == 1 )
        {
            char nomePessoa[100];
            long numeroDeIdentificacao;
         
            cout << "\nQual o nome? ";
            fflush(stdin);
            gets (nomePessoa);
            
            Pessoa p(nomePessoa);
            
            cout << "\nQual o numero de identificacao na empresa? ";
            fflush(stdin);
            cin >> numeroDeIdentificacao;
            
            Funcionario f(numeroDeIdentificacao);
            
            tratandoFuncionario(3);
        }
        else if ( tipoDeAccao == 2 )
        {
             char novoNome[100];
             long novoNumeroDeIdentificacao;
             
             cout << "\n  Alterando...\n";
             cout << "\nNome - "; p.escreverNome();
             cout << "\nNumero - "; f.escreverNumeroDeIdentificacao();
             
             cout << "\nQual o novo nome? ";
             fflush(stdin);
             gets (novoNome);
             p.alterarNome(novoNome);
             
             cout << "\nQual o novo numero de identificacao? ";
             fflush(stdin);
             cin >> novoNumeroDeIdentificacao;
             f.alterarNumeroDeIdentificacao(novoNumeroDeIdentificacao);
             
             system("PAUSE");
             system("cls"); 
        }
        else if ( tipoDeAccao == 3 )
        {
             cout << "\nVisializando Pessoa..." << endl;
             cout << "\nNome - "; p.escreverNome();
             cout << "\nNumero - "; f.escreverNumeroDeIdentificacao();
             
             system("PAUSE");
             system("cls");
        }
        else
        {
            return(0);    
        }
}

O meu problema está aqui:

PHP:
if( tipoDeAccao == 1 )
        {
            char nomePessoa[100];
            long numeroDeIdentificacao;
         
            cout << "\nQual o nome? ";
            fflush(stdin);
            gets (nomePessoa);
            
            Pessoa p(nomePessoa);
            
            cout << "\nQual o numero de identificacao na empresa? ";
            fflush(stdin);
            cin >> numeroDeIdentificacao;
            
            Funcionario f(numeroDeIdentificacao);
            
            tratandoFuncionario(3);
        }

Quando chamo a função tratandoFuncionario com o valor 3, entra no seguinte if:

PHP:
else if ( tipoDeAccao == 3 )
        {
             cout << "\nVisializando Pessoa..." << endl;
             cout << "\nNome - "; p.escreverNome();
             cout << "\nNumero - "; f.escreverNumeroDeIdentificacao();
             
             system("PAUSE");
             system("cls");
        }

Mas o meu problema é que o output dado, não é o que eu quero.

Apareçe apenas:

Visializando Pessoa...

Nome -
Numero - 0


Ou seja ele não está a conseguir obter o objecto adicionado antes :S

tipoDeAccao == 1 disse:
Pessoa p(nomePessoa);
Funcionario f(numeroDeIdentificacao);

Eu ainda sou um novato no que toca a Orientação a Objectos, se poderem ajudar agradeço-vos :x2:

Com os melhores cumprimentos,
Nelson Ferreira
 
bom, basicamente ele está a fazer o que tu o mandas fazer =)
o problema é o seguinte:

se eu percebi, esta função aplica uma acção conforme o numero que vem no tipoDeAccao que é passado a função. o problema aqui é que tu não consegues adicionar um novo nome e depois chamar a função outra vez para fazer print para o standard output, simplesmente porque sempre que chamas a função, ele cria uma novo p do tipo Pessoa e por isso ele imprime sempre "" para o p e 0 para o f.

outro erro também, é que quando o tipoDeAccao é 1, ele cria outra vez outra Pessoa com nome p (variavel com nome repetido, que ja foi declarado no inicio da função) dentro do scoop do if, ou seja, mal o if acabe, essa variavel é destruida, tal como sempre que a função acaba, o p do tipo Pessoa que declaraste no inicio da função, tb é destruida (o mesmo se aplica para o f).

para resolver esses problemas vais ter de defenir a função com um outro parametro que é a class Pessoa que queres modificar, e o funcionario que queres aceder, basicamente algo do genero:

PHP:
int tratandoFuncionario(int tipoDeAccao, Pessoa& p, Funcionario& f)
{
        if( tipoDeAccao == 1 )
        {
            char nomePessoa[100];
            long numeroDeIdentificacao;
         
            cout << "\nQual o nome? ";
            fflush(stdin);
            gets (nomePessoa);
            
            p = nomePessoa; //aqui a class Pessoa têm de ter um metodo para definir o nome da pessoa, usando overwrite do operador = ou com um metodo do genero Pessoa::SetNome().
            
            cout << "\nQual o numero de identificacao na empresa? ";
            fflush(stdin);
            cin >> numeroDeIdentificacao;
            
           f = numeroDeIdentificacao;//aqui a mm coisa
            
            tratandoFuncionario(3, p, f);
        }
        else if ( tipoDeAccao == 2 )
        {
             char novoNome[100];
             long novoNumeroDeIdentificacao;
             
             cout << "\n  Alterando...\n";
             cout << "\nNome - "; p.escreverNome();
             cout << "\nNumero - "; f.escreverNumeroDeIdentificacao();
             
             cout << "\nQual o novo nome? ";
             fflush(stdin);
             gets (novoNome);
             p.alterarNome(novoNome);
             
             cout << "\nQual o novo numero de identificacao? ";
             fflush(stdin);
             cin >> novoNumeroDeIdentificacao;
             f.alterarNumeroDeIdentificacao(novoNumeroDeIdentificacao);
             
             system("PAUSE");
             system("cls"); 
        }
        else if ( tipoDeAccao == 3 )
        {
             cout << "\nVisializando Pessoa..." << endl;
             cout << "\nNome - "; p.escreverNome();
             cout << "\nNumero - "; f.escreverNumeroDeIdentificacao();
             
             system("PAUSE");
             system("cls");
        }
        else
        {
            return(0);    
        }
}

int main( int argc, cha** argv )
{
  Pessoa p("");
  Funcionario f( 0 );
  tratandoFuncionario( 1, p, f );

  return 0;
}

btw, em vez de usar int para o tipo de accao, talvez possas usar um enum para ficar mais explicito. espero que tenha ajudado.
 
Boas sapropel,

obrigado pela ajuda, percebi perfeitamente a tua explicação. :)

Só a última frase é que me passou ao lado :(. . .

Neste pedaço de código, eu estou a passar os apontadores, certo? É que se for o caso, o main() não seria assim:

PHP:
int main( )
{
  Pessoa *p;  // Penso que é isto
  p = new Pessoa;  // Ou qualquer coisa do género
  Funcionario f( 0 );
  tratandoFuncionario( 1, p, f );

  return 0;
}

Eu digo isto, porque vou trabalhar com vários objectos e ontem tive a tarde todo a procurar uma maneira de criar um array / lista para poder guardar o endereços de memória de cada objecto criado, para que possa trabalhar com eles.

Vi algo que me pode ajudar:

PHP:
class myClass
{
  int m_i;
public:
  myClass(int i)
  {
    m_i = i;
  }
};

voi main()
{
  myClass obj2;
  myClass obj = myClass(20);
  myClass myArray[3] = { myClass(1), myClass(4), myClass(10) };
  myClass *p;
  p = new myClass[3];
}

Mas não percebi bem como posso criar um array para um indeterminado número de elementos. . Pois não sei kts objectos vão ser criados, dou um número máximo?
 
Última edição:
não, ali está a passar por referencia (é uma feature do c++).
também se podia fazer com apontadores, mas a verdade é que com c++ deve-se usar referencias quando se pode e apontadores quando se é obrigado. com referencias podes tratar dos objectos como se fossem o proprio obejcto sem ser preciso usar o operador dereference * ou -> (quando é uma classe, etc).
referencias são como um "nome alternativo" para um dado objecto, e usan-se basicamente para pass-by-reference em funções e metodos:
http://www.parashift.com/c++-faq-lite/references.html

também se podia usar apontadores claro, mas nesse caso a função ficava:
int tratandoFuncionario(int tipoDeAccao, Pessoa* p, Funcionario* f){...}

e no main ficava:
Pessoa p( "" );
Funcionario f( 0 );
tratandoFuncionario( 3, &p, &f ); //&p por exemplo faz passar o endereço da variavel p que vai ser apontado pelo apontador *p que esta na declaração da função.

espero ter ajudado.
 
Última edição:
não, ali está a passar por referencia (é uma feature do c++).
também se podia fazer com apontadores, mas a verdade é que com c++ deve-se usar referencias quando se pode e apontadores quando se é obrigado. com referencias podes tratar dos objectos como se fossem o proprio obejcto sem ser preciso usar o operador dereference * ou -> (quando é uma classe, etc).
referencias são como um "nome alternativo" para um dado objecto, e usan-se basicamente para pass-by-reference em funções e metodos:
http://www.parashift.com/c++-faq-lite/references.html

também se podia usar apontadores claro, mas nesse caso a função ficava:
int tratandoFuncionario(int tipoDeAccao, Pessoa* p, Funcionario* f){...}

e no main ficava:
Pessoa p( "" );
Funcionario f( 0 );
tratandoFuncionario( 3, &p, &f ); //&p por exemplo faz passar o endereço da variavel p que vai ser apontado pelo apontador *p que esta na declaração da função.

espero ter ajudado.

Sem dúvida que está a ajudar. . ;)

Editei o tópico anterior, se popderes dar uma olhadela :)

Um última coisa, está a funcionar perfeitamente o que disses-te na tua primeira resposta, muito obrigado :biglaugh:
 
Última edição:
dá uma olhada a classe std::vector que faz parte da STL
vector funciona como um array dinamico em que podes adicionar, remover, ler, procurar, etc elementos sem grande trabalho e não precisas de dar um tamanho ao vector, ele vai aumentando e diminuindo conforme tiras ou metes elementos.
por exemplo:

vector <Pessoa> vec; // criar vector que aloja objectos do tipo pessoa
Pessoa p1("p1");
Pessoa p2("p2");

vec.push_back( p1 ); // adiciona p1 ao vector
vec.push_back( p2 ); // adiciona p2 ao vector

vec[0] vai ser p1
vec[1] vai ser p2

vec.pop_back(); // removeu o ultimo elemento, que era o p2

http://www.cprogramming.com/tutorial/stl/iterators.html -> tutorial sobre o std::vector
http://cppreference.com/cppvector/index.html -> referencia (metodos, etc)
 
Muito obrigado mais uma vez. . :)

Já estive a ler sobre isso e estou mesmo a pensar em utilizar um container map.

Para funcionar com os objectos da seguinte maneira:

PHP:
pessoas["/*Nome Objecto 1*/"] = /*Ponteiro Objecto 1*/;
pessoas["/*Nome Objecto 2*/"] = /*Ponteiro Objecto 2*/;
pessoas["/*Nome Objecto 3*/"] = /*Ponteiro Objecto 3*/;
pessoas["/*Nome Objecto 4*/"] = /*Ponteiro Objecto 4*/;

Mas poderei estar a perder tempo com um container map sem necessidade, pois posso só utilizar o tal vector de que me falas-te e sendo assim seria:

PHP:
v[0] = /*Ponteiro Objecto 1*/;
v[1] = /*Ponteiro Objecto 1*/;
v[2] = /*Ponteiro Objecto 1*/;
v[3] = /*Ponteiro Objecto 1*/;

...e para obter o nome seria algo do género:

v[0] -> escreveNome();

Estou correcto?
 
yep é basicamente isso =)
o map é mais lento a inserir e a remover elementos mas é muito rapido a fazer procuras, porque intriormente o map funciona como uma red black binary tree, e sempre que adicionas ou removes um elemento a arvore e restruturada no interior para permitir procuras mais eficientes.

o vector é mais rapido a inserir e remover elementos, aquilo funciona basicamente como uma array dinamica.
 
yep é basicamente isso =)
o map é mais lento a inserir e a remover elementos mas é muito rapido a fazer procuras, porque intriormente o map funciona como uma red black binary tree, e sempre que adicionas ou removes um elemento a arvore e restruturada no interior para permitir procuras mais eficientes.

o vector é mais rapido a inserir e remover elementos, aquilo funciona basicamente como uma array dinamica.

Mais uma vez obrigado pela explicação :)

Uma coisa com que estou à porrada desde ontem:

PHP:

PHP:
char novoNome[100];
long novoNumeroDeIdentificacao;
            
cout << "\nQual o nome? "; fflush(stdin);
gets (novoNome);
             
cout << "\nQual o numero de identificação? "; fflush(stdin);
cin >> novoNumeroDeIdentificacao;
            
char *Nome = novoNome;
Pessoa p(Nome);
Funcionario f( novoNumeroDeIdentificacao );
            
op = 0;
while ( op != 3 )
{
      op = menus("CriarPessoa", "Funcionario");
      switch(op)
      {
             case 1: tratandoFuncionario( 1, p, f ); break;
             case 2: tratandoFuncionario( 2, p, f ); break;
      }
}

Eu aqui estou a apontar para o nome mas na realidade eu quero apontar para a posição no memória onde o objecto se encontra.
Tenho estado a ler e pelo que entendi vou ter que trabalhar com o constructor para reservar memória e com o destructor para libertar a memória reservada, até ai tudo bem. .

Classes:

PHP:
class Pessoa
{
    private:
           std::string nome;
         
    public:    
           // Métodos Públicos
           Pessoa(void);
           // class constructor
           Pessoa(std::string novoNome);
           // class destructor
           ~Pessoa(void);
           
           virtual std::string obtemNome() const;
           
           virtual void alterarNome(std::string novoNome);
           virtual void escreverNome(std::ostream& f=std::cout) const;
};

PHP:
class Funcionario: public Pessoa
{
      private:
             unsigned long numeroDeIdentificacaoNaEmpresa;
	  public:
		     // Métodos Públicos
		     Funcionario(void);
    		 // class constructor
             Funcionario(unsigned long novoNumeroDeIdentificacao);
    		 // class destructor
    		 ~Funcionario();
    		
    		 virtual unsigned long obtemNumeroDeIdentificacao() const;
           
             virtual void alterarNumeroDeIdentificacao(unsigned long numeroDeIdentificacao);
             virtual void escreverNumeroDeIdentificacao(std::ostream& f=std::cout) const;
};

Eu estou é confundido com o problema de estar sempre a trabalhar com, no minimo 2 classes.

  • A classe Funcionário herda da classe pessoa, mas tenho sempre que criar um objecto do tipo pessoa?
  • Então como vou apontar para o(s) espaço(s) da memória correcto(s)?
  • Assim vão haver 2 espaço de memória referente ao funcionário?
 
Última edição:
só uma coisa, pk é que não usas std:string sempre?

string novoNome;
cin >> novoNome; ou getline( cin, novoNome );

e pronto, até porque se o user inserir uma string de chars maior que 100 pode com jeitinho criar um exploit aí :)

outra coisa:

char novoNome[100];
só "novoNome" vai corresponder ao endereço da posição 0 da array ou seja:
novoNome == &novoNome[0];

quando fazes char* Nome = novoNome;
Nome vai ser == &novoNome[0];
e *Nome vai ser == novoNome[0];

mas em conclusão é: usa string sempre que puderes, aliás a tua propria classe Pessoa pede uma std::string no constructor, para quê mudar?

fora isso, não tou a ver qual é a duvida.
 
Boas :)

Mais uma vez a minha inesperiência a trabalhar com o biblioteca do C++ :S Acredita que cheguei a pensar em criar uma função para verificar o tamanho da string recebida! Pronto, percebido e problema resolvido. :004:

Quanto à minha dúvida, de criar um array para os objectos estou a pensar resolver da seguinte maneira, gostava de saber o que pensas disto.

PHP:
if( criaFuncionario )
{
     Funcionario FuncNovo(0);
     FuncNovo.Inicializa;
     ArrayPessoas[NumElementos] = FuncNovo;
     NumElementos++;
}

Isto foi o que consegui fazer na aula quando estava a ouvir o prof. a explicar como poderia fazer. Será correcto? Há um método melhor?

PHP:
Funcionario::Inicializa()
{
     Pessoa.Inicializa();
     cout << " Número do funcionário? " << endl;
     cin >> novoNome;
}

Queria saber isto é um bom método também, estou a pensar alterar um pouco as minhas classes, acrescentando esta função, pouparia bastantes linhas de código, que axas?

Muito Obrigado pelo teu tempo ;)
 
Classe Pessoa

PHP:
#ifndef PESSOA_H
#define PESSOA_H
#include <stdio.h>
#include <iostream>

class Pessoa
{
    private:
           std::string nome;
    public:    
           Pessoa(void);
           Pessoa(std::string novoNome);
           ~Pessoa(void);
           
           virtual std::string obtemNome() const;
           virtual void Inicializar() const;
           virtual void alterarNome(std::string novoNome);
           virtual void Escrever(std::ostream& f=std::cout) const;
};

#endif // PESSOA_H

PHP:
#include <iostream>
#include "pessoa.h" // class's header file
using namespace std;

Pessoa::Pessoa(void): nome("") {}
Pessoa::Pessoa(std::string novoNome): nome(novoNome) {}
Pessoa::~Pessoa() {}

std::string Pessoa::obtemNome() const
{
     return nome;
}
void Pessoa::Inicializar() const
{
     string nome;
     cout << "Qual o nome da pessoa? " << endl;
     cin >> nome;
}
void Pessoa::alterarNome(std::string novoNome)
{
	nome = novoNome;
}
void Pessoa::Escrever(std::ostream& f) const 
{
	f << nome << " ";
	f << std::endl;
}

Classe Funcionário

PHP:
#ifndef FUNCIONARIO_H
#define FUNCIONARIO_H
#include "pessoa.h" // inheriting class's header file

class Funcionario: public Pessoa
{
      private:
             unsigned long numeroDeIdentificacaoNaEmpresa;
      public:
             Funcionario(void);
             Funcionario(unsigned long novoNumeroDeIdentificacao);
    	     ~Funcionario();
    		
    	     virtual unsigned long obtemNumeroDeIdentificacao() const;
    	     virtual void Inicializar() const;
             virtual void alterarNumeroDeIdentificacao(unsigned long numeroDeIdentificacao);
             virtual void Escrever(std::ostream& f=std::cout) const;
};
#endif // FUNCIONARIO_H

PHP:
#include "funcionario.h" // class's header file
using namespace std;

// class constructor
Funcionario::Funcionario(void): numeroDeIdentificacaoNaEmpresa(0) {}
Funcionario::Funcionario(unsigned long novoNumeroDeIdentificacao): numeroDeIdentificacaoNaEmpresa(novoNumeroDeIdentificacao) {}
Funcionario::~Funcionario() {}

unsigned long Funcionario::obtemNumeroDeIdentificacao() const
{
     return numeroDeIdentificacaoNaEmpresa;
} 
void Funcionario::Inicializar() const
{
     long numeroDeIdentificacaoNaEmpresa;
     //Inicializar().Pessoa;
     cout << " Qual o número de identificação? " << endl;
     cin >> numeroDeIdentificacaoNaEmpresa;
}
void Funcionario::alterarNumeroDeIdentificacao(unsigned long novoNumeroDeIdentificacao)
{
     numeroDeIdentificacaoNaEmpresa = novoNumeroDeIdentificacao;
}    
void Funcionario::Escrever(std::ostream& f) const
{
     //Escrever().Pessoa;
     f << numeroDeIdentificacaoNaEmpresa << " ";
     f << std::endl;
}

Código

PHP:
void gerirPessoa()
{
    int op = 0;
    Pessoa AP[999];
    int numeroElementos = 0;
    
    while ( op != 4 )
    {
        op = 0;
        op = menus("GerirPessoas", "");
        
        if ( op == 1 )
        {
             //Pessoa PessoaNovo("");
             Funcionario FuncionarioNovo(0);  // Crio um novo Funcionário
             FuncionarioNovo.Inicializar();  // Inicializo-o
             AP[numeroElementos] = FuncionarioNovo;  // Guardo no array de pessoas
             numeroElementos++;  // Incremente o número de elementos
             
             FuncionarioNovo.Escrever();  // Escrevo o Funcionario para teste

Já pesquisei bastante e não consigo achar uma solução para este erro. :S

[Linker error] undefined reference to `Pessoa::escreverNome(std:: ostream&) const'
[Linker error] undefined reference to `Funcionario::escreverNumeroDeIdentificacao(std:: ostream&) const'
[Linker error] undefined reference to `Pessoa::escreverNome(std:: ostream&) const'
ld returned 1 exit status
[Build Error] [TrabalhoLP2.exe] Error 1


Só dizem que é por a biblioteca ou classe estar mal defenida, mas não acho nada de mal :S
 
Última edição:
quanto ao teu penultimo post:
o codigo parece-me bem (tirando ali o inicializa falta-lhe os () :p ).

lembra-te só que arrays sao estaticas, portanto tens de ter uma array de tamanho suficiente que dê para ir aguentando os objectos que vais adicionando. isso ou usas um std::vector.

btw, normalmente o proprio constructor é que chama o metodo ::Inicializa() (ou qualquer outro metodo de inicialização) para o user não se ter de preocupar em ainda chamar um metodo de inicialização (alêm do constructor), que num projecto de maiores dimenções pode dar problemas. se o user se esquece de chamar o ::inicializa() por exemplo, pode gerar bugs que mais tarde podem ser complicados de apanhar. mas isso é só uma dica de design :p

quanto ao ultimo post: tanto a class Pessoa como Funcionario que postaste não têm definições para os metodos escreverNome() e escreverNumeroDeIdentificacao(). é esse o erro.
 
Bem para continuar o trabalho, criei um novo projecto e adicionei as classes que tinha.

Utilizando ainda o método falado antes:

PHP:
void Funcionario::inicializar() const
{
     long numeroDeIdentificacaoNaEmpresa;
     Pessoa PessoaNovo("");
     PessoaNovo.inicializar();
     cout << " Qual o número de identificação? " << endl;
     cin >> numeroDeIdentificacaoNaEmpresa;
     cout << " TESTE - Ya1 " << endl;
     Funcionario alterarNumeroDeIdentificacao(numeroDeIdentificacaoNaEmpresa);
     cout << " TESTE - Ya2 " << endl;
     Funcionario escrever();
}

PHP:
void Pessoa::inicializar() const
{
     string nome;
     cout << "Qual o nome da pessoa? " << endl;
     cin >> nome;
     Pessoa alterarNome(nome);
     Pessoa escrever();
}

Ee simplificando o main():

PHP:
int main(int argc, char *argv[])
{
    Pessoa AP[999];
    int numeroElementos = 0;
    
    Funcionario FuncionarioNovo(0);
    FuncionarioNovo.inicializar();
    AP[numeroElementos] = FuncionarioNovo;
    numeroElementos++;
         
    cout << &AP[0] << " - " << numeroElementos;
    FuncionarioNovo.escrever();
             
    system("PAUSE");
    return EXIT_SUCCESS;
}

Só consigo obter como output:

ps.gif


Que se passa agora?

Eu estive a pensar mas não sei se estou correcto. Será que é por eu estar a aceder dentro de uma classe a uma função dessa mesma classe, não tem muito lógica eu sei mas também não vejo o que mais poderá ser. :(
 
lembra-te só que arrays sao estaticas, portanto tens de ter uma array de tamanho suficiente que dê para ir aguentando os objectos que vais adicionando. isso ou usas um std::vector.

Por enquanto quero conseguir mexer em mais de um objecto, o que está a ser complicado. :(
Depois farei isso que me disses-te :)

btw, normalmente o proprio constructor é que chama o metodo ::Inicializa() (ou qualquer outro metodo de inicialização) para o user não se ter de preocupar em ainda chamar um metodo de inicialização (alêm do constructor), que num projecto de maiores dimenções pode dar problemas. se o user se esquece de chamar o ::inicializa() por exemplo, pode gerar bugs que mais tarde podem ser complicados de apanhar. mas isso é só uma dica de design :p

Não percebi bem a ideia. :( Eu criei o método inicializa() para que possa poupar algumas linhas de código com os couts, o que me estás a dizer é que posso colocar isso no constructor? Se for isso acho muito boa ideia e estou disposto a fazê-lo, só quero a tua confirmação para não estragar mais :(

quanto ao ultimo post: tanto a class Pessoa como Funcionario que postaste não têm definições para os metodos escreverNome() e escreverNumeroDeIdentificacao(). é esse o erro.

Eu percebi isso :( o problema é que eu não tenho esses métodos em lado nenhum. :(

P.S. - Vê o tópico anterior, decidi começar de "novo"
 
Última edição:
por exemplo quando fazes:

Funcionario Escrever() e Pessoa Escrever() não estas a chamar o metodo escrever, estás sim a criar novos objectos do tipo Funcionario e Pessoa chamados Escrever (e ao mm tempo chamando constructor de default).

outra coisa, ali quando fazes:
cout << &AP[0] ele vai esrever no standard output o endereço na memoria do objecto AP[0] (por isso é que aparece 0x21..)

o que tu queres fazer é um metodo "friend" para o objecto cout de maneira a que ele aceite objectos do tipo Pessoa, ou entao tens de fazer um metodo para escrever no standard output, do genero:
AP[0].Escrever(); cout << numeroElementos;

outra coisa:
se ali no inicializar() da Pessoa tu queres mudar o nome dentro dessa propria classe tens de fazer algo do genero:

cin >> nome;
this->alterarNome(nome); //this é um pointer pra propria classe, tb podes chamar so o metodo:

cin >> nome;
alterarNome(nome); //é o mm que está em cima, o this é só para teres a certeza que é "esta" classe que é chamada (quando existem membros com o mm nome dos parametros por exemplo) para não haver confusão.

ja no inicializar do funcionario é a mm coisa:
this->escrever(); e pronto

mais duvidas, é so postar =)
 
Última edição:
Não percebi bem a ideia. :( Eu criei o método inicializa() para que possa poupar algumas linhas de código com os couts, o que me estás a dizer é que posso colocar isso no constructor? Se for isso acho muito boa ideia e estou disposto a fazê-lo, só quero a tua confirmação para não estragar mais :(

e fazes bem em fazer isso, mas em vez de tornares o Inicializa() um metodo public, fazes privado e o constructor é que o chama:

Pessoa:: Pessoa() : nome("") (aqui tive de meter um espaço ' ' entre o :: e o Pessoa pk senao o forum mete um smile)
{
this->inicializa();
}

isto é so para evitar que o user cometa o erro de avançar no projecto sem inicializar a classe, o mais provavel é que visto que tu é que vais usar a classe, não te irias esquecer, isto é mais uma pequena optimização de design do que outra coisa.
 
outra coisa, ali quando fazes:
cout << &AP[0] ele vai esrever no standard output o endereço na memoria do objecto AP[0] (por isso é que aparece 0x21..)

Sm, eu sei :) Era só mesmo para testar a ver o que dava. . Desculpa falhou essa, quando andei a escrever TESTE :S

o que tu queres fazer é um metodo "friend" para o objecto cout de maneira a que ele aceite objectos do tipo Pessoa, ou entao tens de fazer um metodo para escrever no standard output, do genero:
AP[0].Escrever(); cout << numeroElementos;

Eu bem utilizei o - AP[0].escrever(); mas não escreve nada :S

outra coisa:
se ali no inicializar() da Pessoa tu queres mudar o nome dentro dessa propria classe tens de fazer algo do genero:

cin >> nome;
this->alterarNome(nome); //this é um pointer pra propria classe, tb podes chamar so o metodo:

cin >> nome;
alterarNome(nome); //é o mm que está em cima, o this é só para teres a certeza que é "esta" classe que é chamada (quando existem membros com o mm nome dos parametros por exemplo) para não haver confusão.

ja no inicializar do funcionario é a mm coisa:
this->escrever(); e pronto

mais duvidas, é so postar =)

Bem me parecia que faltava ***** coisa :( Já testei e dá-me erro!? Isto é azar!

passing `const Funcionario' as `this' argument of `virtual void Funcionario::alterarNumeroDeIdentificacao(long unsigned int)' discards qualifiers

É melhor colocar o código :S Dsc a falha:

PHP:
void Funcionario::inicializar() const
{
     long numeroDeIdentificacaoNaEmpresa;
     Pessoa PessoaNovo("");
     PessoaNovo.inicializar();
     cout << " Qual o numero de identificacao? " << endl;
     cin >> numeroDeIdentificacaoNaEmpresa;
     cout << " Ya1 " << endl;
     //this->alterarNumeroDeIdentificacao(numeroDeIdentificacaoNaEmpresa);
     cout << " Ya2 " << endl;
     //this->escrever();
}
 
Última edição:
porque estas a fazer ::inicializar() const {...}
esse const é para ter a certeza que não mudas nada dentro da classe (membros como variaveis, etc), o que não é o caso.
 
Última edição:
porque estas a fazer ::inicializar() const {...}
esse const é para ter a certeza que não mudas nada dentro da classe (membros como variaveis, etc), o que não é o caso.

Olha isto é uma loucura! Então não é que tirei o const, desde já agradeço-te por me conseguires explicar muito brevemente o que a minha prof me tentou explicar com um discurso do outro mundo. ( Só um aparte e um muito obrigado! )

Quando tirei o const, começaram os erros outra vez :(

[Linker error] undefined reference to `Funcionario::inicializar() const'
[Linker error] undefined reference to `Pessoa::inicializar() const'
ld returned 1 exit status
[Build Error] [TrabalhoFinal.exe] Error 1


A classe Pessoa ( Actual )

PHP:
#ifndef PESSOA_H
#define PESSOA_H

#include <stdio.h>
#include <iostream>

class Pessoa
{
    private:
           std::string nome;
           void inicializar();
    public:    
           // Métodos Públicos
           Pessoa(void);
           // class constructor
           Pessoa(std::string novoNome);
           // class destructor
           ~Pessoa(void);
           
           virtual std::string obtemNome() const;
           
           virtual void alterarNome(std::string novoNome);
           virtual void escrever(std::ostream& f=std::cout) const;
};

#endif // PESSOA_H

PHP:
#include <iostream>
#include "pessoa.h" // class's header file

using namespace std;

// class constructor
Pessoa::Pessoa(void): nome("")
{
     this->inicializar();
}
Pessoa::Pessoa(std::string novoNome): nome(novoNome)
{}
// class destructor
Pessoa::~Pessoa()
{}
std::string Pessoa::obtemNome() const
{
     return nome;
}
void Pessoa::inicializar()
{
     string nome;
     cout << "Qual o nome da pessoa? " << endl;
     cin >> nome;
     this->alterarNome(nome);
     this->escrever();
}
void Pessoa::alterarNome(std::string novoNome)
{
	nome = novoNome;
}
void Pessoa::escrever(std::ostream& f) const 
{
	f << nome << " ";
	f << std::endl;
}
 
Última edição:
Back
Topo