1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por PaNcRoNi, 8 de Dezembro de 2006. (Respostas: 61; Visualizações: 5503)

  1. PaNcRoNi

    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 == )
            {
                
    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 == )
            {
                 
    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 == )
            {
                 
    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 == )
            {
                
    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 == )
            {
                 
    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

    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
     
  2. sapropel

    sapropel Power Member

    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 tipoDeAccaoPessoapFuncionariof)
    {
            if( 
    tipoDeAccao == )
            {
                
    char nomePessoa[100];
                
    long numeroDeIdentificacao;
             
                
    cout << "\nQual o nome? ";
                
    fflush(stdin);
                
    gets (nomePessoa);
                
                
    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;
                
               
    numeroDeIdentificacao;//aqui a mm coisa
                
                
    tratandoFuncionario(3pf);
            }
            else if ( 
    tipoDeAccao == )
            {
                 
    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 == )
            {
                 
    cout << "\nVisializando Pessoa..." << endl;
                 
    cout << "\nNome - "p.escreverNome();
                 
    cout << "\nNumero - "f.escreverNumeroDeIdentificacao();
                 
                 
    system("PAUSE");
                 
    system("cls");
            }
            else
            {
                return(
    0);    
            }
    }

    int mainint argccha** argv )
    {
      
    Pessoa p("");
      
    Funcionario f);
      
    tratandoFuncionario1p);

      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.
     
  3. PaNcRoNi

    PaNcRoNi What is folding?

    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
      
    = new Pessoa;  // Ou qualquer coisa do género
      
    Funcionario f);
      
    tratandoFuncionario1p);

      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;
      
    = 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: 9 de Dezembro de 2006
  4. sapropel

    sapropel Power Member

    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: 9 de Dezembro de 2006
  5. PaNcRoNi

    PaNcRoNi What is folding?

    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: 9 de Dezembro de 2006
  6. sapropel

    sapropel Power Member

    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)
     
  7. PaNcRoNi

    PaNcRoNi What is folding?

    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?
     
  8. sapropel

    sapropel Power Member

    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.
     
  9. PaNcRoNi

    PaNcRoNi What is folding?

    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 fnovoNumeroDeIdentificacao );
                
    op 0;
    while ( 
    op != )
    {
          
    op menus("CriarPessoa""Funcionario");
          switch(
    op)
          {
                 case 
    1tratandoFuncionario1p); break;
                 case 
    2tratandoFuncionario2p); 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::ostreamf=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::ostreamf=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: 10 de Dezembro de 2006
  10. sapropel

    sapropel Power Member

    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.
     
  11. PaNcRoNi

    PaNcRoNi What is folding?

    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 ;)
     
  12. PaNcRoNi

    PaNcRoNi What is folding?

    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::ostreamf=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::ostreamf) const 
    {
        
    << nome << " ";
        
    << 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::ostreamf=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::ostreamf) const
    {
         
    //Escrever().Pessoa;
         
    << numeroDeIdentificacaoNaEmpresa << " ";
         
    << std::endl;
    }
    Código

    PHP:
    void gerirPessoa()
    {
        
    int op 0;
        
    Pessoa AP[999];
        
    int numeroElementos 0;
        
        while ( 
    op != )
        {
            
    op 0;
            
    op menus("GerirPessoas""");
            
            if ( 
    op == )
            {
                 
    //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: 12 de Dezembro de 2006
  13. sapropel

    sapropel Power Member

    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.
     
  14. PaNcRoNi

    PaNcRoNi What is folding?

    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 argcchar *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:

    [​IMG]

    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. :(
     
  15. PaNcRoNi

    PaNcRoNi What is folding?

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

    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 :(

    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: 12 de Dezembro de 2006
  16. sapropel

    sapropel Power Member

    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: 12 de Dezembro de 2006
  17. sapropel

    sapropel Power Member

    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.
     
  18. PaNcRoNi

    PaNcRoNi What is folding?

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

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

    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: 12 de Dezembro de 2006
  19. sapropel

    sapropel Power Member

    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: 12 de Dezembro de 2006
  20. PaNcRoNi

    PaNcRoNi What is folding?

    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::ostreamf=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::ostreamf) const 
    {
        
    << nome << " ";
        
    << std::endl;
    }
     
    Última edição: 12 de Dezembro de 2006

Partilhar esta Página