Ir para conteúdo
Fórum Script Brasil

Castro

Membros
  • Total de itens

    103
  • Registro em

  • Última visita

Posts postados por Castro

  1. :)

    Ok. Fiz o seguinte teste:

    Criei um projeto chamado tela.dev. Nele coloquei os seguintes arquivos:

    cursor.ccp

    void gotoxy(int x, int y) {
      COORD c;
      c.X = x - 1;
      c.Y = y - 1;
      SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
    }
    posição_tela
    #include <iostream>
    #include <windows>
    using namespace std;
    
    int main()
    {
       gotoxy(10,20);
       cout << "posição na tela";
       return 0;
    }

    Erro

    D:\Sobre_C++\TestC++\Makefile.win [build Error][posição_tela.o] Error 1

    O que está errado ?

    Obrigado

  2. :rolleyes:

    Estou iniciando aqui um estudo sobre construtores. Considere o programa e seus comentários, pois deles tirarei as perguntas. Os comentários são tirados do livro “C++ guia para iniciantes –Sdhild. Espero que minhas dúvidas sejam úteis para outros...

    Neste tópico também colocarei algumas dúvidas sobre funções que se relacionarem com os programas. Considere o primeiro programa:

    #include <iostream>
    using namespace std;
    
    class classe
    {
          int valor;
          public:
                 classe (int i)
                 {
                  valor=i;
                  cout << "Dentro do construtor:\n";
                 }
             ~classe() {cout << "Destuindo:\n";}    
                 
          int pegavalor() {return valor;}
          
    };
    
    void display (classe obj)
    {
         cout << obj.pegavalor() << "\n";
    }
    
         int main()
         {
             
         classe a(10); 
             
         cout << "valor ´a´ antes da chamada de display() ";
         
         display(a);
             
         cout << "Valor de ´a´ depois de display() retornar ";
         display(a);
         system ("pause");
         return 0;
    }
    
    
    /* Como você pode ver, há uma chamada para o construtor (que ocorre
    quando "a" é criado), mas há duas chamadas para o destrutor. Vamos ver
     porque este é o caso.
    
     Quando um objeto é passado para uma função, uma cópia daquele objeto é
     feita,(e esta cópia se torna o parâmetro da função). Isto siguinifica
     que um novo objeto passa há existir.Quando a função termina, a cópia
     do argumento (ou seja, o parâmetro) é destruida. Isto levanta duas per-
     guntas fundamentais: primeiro, o construtor do objeto é chamado quando
     a cópia é feita ? segundo, o destrutor do objeto é chamado quando a 
     cópia é destruida ? as respostas a principio, surpreender você.
    
     Quando uma cópia de um argumento é feita durante uma chamada de função,
     o construtor normal não é chamado. Ao invés disto o construtor , o 
     costrutor de cópia do objeto é chamado. Um construtor de cópia define
     como uma cópia de um objeto é feita. (...) No entanto, se uma classe
     não definir explicitamente um construtor de cópia, então C++ fornece um
     por default. O construtor de cópia default cria uma cópia de modo de
     bit (ou seja identica) do objeto. A razão pela qual uma cópia de modo
     de bit é feita é fácil de entender se você pensar a respeito. Como um
     construtor normal é usado para inicializar algum aspecto de um objeto, ele
     não deve ser chamado para fazer  uma cópia de um objeto já
     existente. Tal chamada alteraria o conteúdo do objeto. Ao passar
     um objeto para uma função, você quer usar o estado atual do objeto, não
     seu estado inicial. 
    
    No entanto,quando a função termina e a cópia do objeto usada como um
    argumento é destruída, a função destrutor é chamada. Isto é necessário
    porque o objeto saiu do escopo.É por isso que  o programa anterior
    tinha duas chamadas para o destruidor. A primeira foi quando o
    parâmetro para display() saiu do escopo. A segunda foi quando "a" dentro
    de main() foi destruída quando o programa terminou */
    1 – Considerando,que ouve uma segunda chamada de construtor/destrutor defult, isso não explica como o construtor criado, foi ativado, pois dentro de main() não há nenhuma chamada tipo:
    classe();
    ou
    ~classe();
    Como então construtores são ativados, independente de serem de cópia ? basta defini-los dentro da classe ? 2- Se eu defini-los como uma função de classe, ou seja,
    classe:: classe()
    {
        var1=valor1;
        var2=valor2;
    };
    e usar essas variáveis inicializadas no construtor, poderei usar diretamente em main(), sem precisar chamar o construtor. Pergunto: no caso de construtores como esse, que não são parametrizados, precisa de destrutor ? 3 – Considerando, que o construtor não é parametrizado, para ele destruir os objetos bastaria chamar o construtor vazio ou se deve mencionar as variáveis de alguma forma no destrutor ? 4- No programa acima, há funções como display(), que foram definidas fora da classe, e antes da função main(), percebi, que estas funções não precisam ter o protótipo citado, notei, que se eu declarar o protótipo antes do include, tipo:
    void display (classe obj);

    No programa acima, dará erro. Por que ? se estou informando o protótipo e o mesmo não está definido na classe. .

    5- O curioso, é que se eu definir essa função abaixo de main(), com protótipo antes do include, e sem relaciona -las a classe, também dará erro. Por quê ? não teria que seguir as regras de C ?

    6- O fato de display() não estar prototipada na classe, e ter sido implementada fora dela, indica que display() não é função membro, correto ?

    Obrigado

  3. :D

    Ok. Deu certo. Mas existe aplicação em C++ para extern ? em C, era um recurso para se ter variável global. O comentário feito está certo ?

    Existe uma outra aplicação para extern, que diz:

    Avariação em extern fornece uma especificação de link que é uma instrução para o compilador sobre como uma função deve ser tratada pelo linker. Por default, as funções são lincadas como funções de C++, mas uma especificação de link permite que você ligue uma função para um tipo diferente de linguagem, A forma geral de um especificador de link

    extern"linguagem" funtion-prototype - Schildt

    extern "C" void myCfunc();

    No exmplo e citação acima, fala-se em tratamento diferenciado de função.Pelo que entendi, permite a ultilização de funções criadas em outras linguagens no C++. Correto ? caso tenha entendido certo, como seria isso ? no casso de C para C++ não vejo vantagem, como mostrado. Poderia comentar ?

    Obrigado

  4. :rolleyes:

    Não entendi. Munha expectativa, era após declarar o cabeçalho, era poder escrever:

    gotoxy (5,10); cout << "texto na tela \n";

    onde

    10 seria a linha

    5 a coluna

    era até uma função muito usada em C. que ficava em conio2.h. tive até que baixar o pacote do DV-C++ na época. Mas que em C++ esteja em outra biblioteca. Pelo que entendi de sua resposta,

    estaria em windows.h.

    Entretaanto, imaginava, que bastava chamar o cabeçalho, e usar como indiquei. Não imaginava ter que criar a função, como você mostrou.

    Creio que meu DEV-C++ seja pára windos, pois rodo debaixo dele.Mas quando rodo meu código vejo tudo na velha tela preta.

  5. :rolleyes:

    Fiz o teste de duas formas diferentes.

    1- Só indiquei o caminho no #include. Não deu certo;

    2- Considerei como projeto, e segui as orientações para projeto dev no post 2, deixei o caminho no #include. Não deu certo,

    3- Tirei o caminho do #include, e deixei o caminho nas opções de projeto, não deu certo.

    4- Tirei o caminho de opções de projeto e voltei a colocar no #include.

    O que me chamou a atenção, é que os erros mostrados indicam outros problemas referentes ao arquivo .h. Por isso, vou postar o projeto com os erros para vocês verem.Eu realmente uso a IDE para Windows, e isso deve gerar algumas dificuldades.

    Por falar nisso, o que vocês chamam de:

    switch -I na linha de comando
    Eu já tive que usar parâmetros para incluir pacotes no DEV-C++, mas..

    Eis o projeto

    Arquivo cpp

    #include "D:\Sobre_C++\ProgC++funcionando\externa.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << PI;
        system("PAUSE");
        return 0;
    }
    Arquivo .h
    extern const double PI 3.1416;  // cria uma contante global externa
    
    /* O expeciificador extern permite que uma variiável seja conhecida
    por outro módulo, mas não cria na realidade aquela variável. Em outras
    palavras, extern que o compilador saiba quais são os tipos e nomes para
    estas variáveis globais sem na realidade crirar armazenazem para elas
    novamente. Qundo o linker liga os dois módulos todas as referências
    são resolvidas*/

    Erros:

    1 C:\Dev-Cpp\Templates\principal.cpp In file included from C:/Dev-Cpp/Templates/principal.cpp

    1 D:\Sobre_C++\ProgC++funcionando\externa.h expected init-declarator before numeric constant

    1 D:\Sobre_C++\ProgC++funcionando\externa.h expected `,' or `;' before numeric constant

    C:\Dev-Cpp\Templates\principal.cpp In function `int main()':

    7 C:\Dev-Cpp\Templates\principal.cpp `PI' undeclared (first use this function)

    (Each undeclared identifier is reported only once for each function it appears in.)

    D:\Sobre_C++\ProgC++funcionando\Makefile.win [build Error] [C:/Dev-Cpp/Templates/principal.o] Error 1

    Obrigado

  6. :rolleyes:

    Vou fazer o teste. Mas achei estranho, pois sempre li, que bastava colocar os arquivos .h e os arquivos .cpp no mesmo diretório. Por que isso ?

    Certa vez, criei dois arquivos .cpp, onde num coloquei a chamada de iostream, namespace std;, a fumção main() com as chamadas das funções contidas no outro arquivo .cpp, e deu tudo certo. Não deu erro, não precisei nem colocar o protótipo da função num arquivo .h e as funções definidas pelo unuário num arquivo separado do arquivo que contém a função main(), como em programas C.

    Poderiam explicar o porquê disso ? o procedimento de incluir todo o caminho é válido para todo compilador ou só para o DEV-C++ ?

    Obrigado

  7. :rolleyes:

    Considere a citação e o programa abaixo:

    “Se ambos os objetos são do mesmo tipo (ou seja, ambos são objeto da mesma classe), então um objeto pode ser atribuído a outro. Não é suficiente para as duas classes ser fisicamente similares – seus nomes de tipo devem ser os mesmos. Por default, quando um objeto é atribuído a outro,uma cópia de modo de bit dos dados do primeiro objeto é atribuído ao segundo. Assim, após a atribuição, os dois objetos serão idênticos, mas separados” – ( C++ guia para iniciantes,Schild)

    // atribuindo objetos
    
    #include <iostream>
    using namespace std;
    
    class test
    {
       int a,b;
       
       public:
              void setab(int i,int j){a=i,b=j;}
              void showab()
              {
                   cout << "a e " << a << "\n";
                   cout << "b e " << b << "\n";
              }
       
    };
    
    class test2
    {
       int a,b;
       
       public:
              void setab2(int i,int j){a=i*2,b=j*2;}
              void showab2()
              {
                   cout << "a e " << a << "\n";
                   cout << "b e " << b << "\n";
              }
           };
    
    int main()
    {
        test ob1, ob2;
        
        ob1.setab(10,20);
        ob2.setab(0,0);
        
        cout << "ob1 antes da designacao: \n\n";
        ob1.showab();
        
        cout << "\nob2 antes da designacao:\n";
        ob2.showab();
        cout << "\n";
        
        ob2 = ob1; // atribui ob1 a ob2
        
        cout << "\nob1 depois da designacao:\n";
        ob1.showab();
        cout << "\nob2 depois da designacao:\n";
        ob2.showab();
        cout << "\n";
        
        ob1.setab(-1,-1); // modifique ob1
        
        cout << "\nob1 depois da mudanca de ob1:\n";
        ob1.showab();
        cout << "\nob2 depois da mudanca de ob1:\n";
        ob2.showab();
        
        test2 ob3;
        
        ob3.setab2(30,40);
        cout << "\nob3 antes da mudanca:\n";
        ob3.showab2();
        cout << "\nob1 depois da mudanca de ob3:\n";
        
        ob1=ob3;
        ob1.showab();
        system ("pause");
    return 0;
    }
    1- Lendo o texto acima, pode-se deduzir, que se os objetos de classes diferentes podem ser atribuídos. Entretanto, o programa apresenta erro caindo na linha
    ob1=ob3;

    erros:

    D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp In function `int main()':

    69 D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp no match for 'operator=' in 'ob1 = ob3'

    note D:\Sobre_C++\Livro C++guia para iniciantes\atribuicao_de_objetos.cpp:7 candidates are: test& test::operator=(const test&)

    Pergunto: as funções e atributos das duas classes não praticamente idênticos ? só muna o nome das funções e o parâmetros são multiplicados na classe test2. O tipo de objetos não permanece o mesmo ?

    2- Se eu só puder atribuir objetos dentro de uma mesma classe, qual seria a vantagem desse recurso ?

    Obvrigado

  8. :rolleyes:

    Considere o projeto abaixo:

    Criei um projeto chamado global, que contém dois arquivos:

    externa.h

    extern const double PI =3.1416; // cria uma constante global externa
    E um arquivo principal.cpp
    #include <iostream>
    #include "externa.h"
    using namespace std;
    
    int main()
    {
        cout << PI;
        system("PAUSE");
        return 0;
    }

    para usar a constante global, entretanto, está ocorrendo os seguinte erros:

    /Dev-Cpp/Templates/principal.cpp D:\Sobre_C++\ProgC++funcionando\C externa.h: No such file or directory.

    C:\Dev-Cpp\Templates\principal.cpp In function `int main()':

    7 C:\Dev-Cpp\Templates\principal.cpp `PI' undeclared (first use this function)

    (Each undeclared identifier is reported only once for each function it appears in.)

    D:\Sobre_C++\ProgC++funcionando\Makefile.win [build Error][C:/Dev-Cpp/Templates/principal.o] Error 1

    O que está errado ? estou colocando todos os arquivos no mesmo diretório.

    Obrigado

  9. :rolleyes:

    Estou tentando demonstrar, que com o operador de resolução de escopo, posso resolver problemas de ambigüidade. O programa abaixo apresenta erro justamente, porque não conseguiu demonstrar isso.Poderiam modificar o programa, de forma a demonstrar, que sem o operador :: , ocorra a ambigüidade e sem ele ocorra ?

    #include <iostream>
    using namespace std;
    
    class calculo
    {
       int a,b;
       
       public:
       calculo();
       void a();
       int soma();
       
    };
    
    int main()
    {
        
        calculo resultado;
        resultado.soma();
        cout << "\n";   
        system ("pause");
        
        return 0;
    }
    
    calculo::calculo()// contrutor
    {
     a=0;b=0;
    }
    int calculo::soma()
    {
         int valor;
         
         cout << "entre co os dois valorfes da soma\n";
         cin >> a >> b;
         cout << "\n";
         valor = a + b;
         
         cout  << "Total:" << valor;
         return valor;
    }  
    
    void calculo::a()
    {
        cout << "Sem valor\n";
    }

    Erros

    10 D:\Sobre_C++\Livro C++guia para iniciantes\ambiguidade_de_funcao.cpp declaration of `void calculo::a()'

    6 D:\Sobre_C++\Livro C++guia para iniciantes\ambiguidade_de_funcao.cpp conflicts with previous declaration `int calculo::a'

    O Compilador, não retornou nenhuma mensagem tipo: “ambiguity in class”, o que indica, que provavelmente eum não consegui criar uma situação de ambigüidade.

    A idéia é que a ambigüidade seja resolvida com o operador de resolução, e não haja erro.

    Obrigado

  10. :rolleyes:

    Sei que para posicionar o cursor em C, é preciso usar a função gotoxy(), colocando o cabeçalho conio2.h, e fazer algumas configurações no DEV-C++, que é o compilador que eu uso. Mas no C++ ? Qual a função que faz isso ? Qual a biblioteca ? Sei que cconio não é, pois não há este equivalente em C++, como há o cctype que corresponde ao ctype.h do C

    Obigado

  11. :mellow:

    Considere o programa:

    #include <iostream>
    using namespace std;
    char mostra_binario(unsigned int u);
    
    int main()
    {
        int i=1,t;
        
      //Deslocamento para esquerda
      
      for (t=0; t < 8; t++)
      {
          // Deslocamento para a esquerda de 'i' em uma posição
          mostra_binario(i);  
        i=i << 1;
      }
     cout << "\n";
    
     for (t=0; t < 8; t++)
      {
          // Deslocamento para a direita de 'i' em uma posição
          mostra_binario(i);  
        i=i >> 1;
      }
     cout << "\n";
    
    system ("pause");    
    return 0;
    }
    
    char mostra_binario(unsigned int u)
    {
         char binario[8]={''},*bin[8],valor[8];
          
          int j;
          
    // Aqui se usa ponteiro, pois itoa retorna um ponteiro para caracter
         *bin=itoa(u,binario,2);
         
         for(j=0; j <=8; j++)
         {
          valor[j] =*bin[j];
          cout << valor[j];
         }
          
        return valor[j];
    }

    Está dando a seguinte mensagem de erro:

    <nome_executável> encontrou um problema e precisa ser fechado

    Por que isto está acontecendo, se não erro de compilação ?

    Obrigado

  12. :wacko:

    Ok. Desculpe, mas o fato é que não sei fazer sobrecarca de função, para fazer a recurcividade funcionar. por isso recoloquei o código mom os erros, para partir de um ponto sem erro de digitação.

    Se puderfazer a sobrecarga para que eu veja como faz agradeço, Entendi que para usar a função com um argumento, sendo declarado dois, é preciso usar sobrecarga. Mas como fazer isso ?

    Um abraço

  13. :huh:

    Estou postando a classe com a função e os erros para melhor definir a solução do problema. Ah ! já tirei o terceiro R.

    class calculando
    {
          public:
          int arranjo (int n, int p);
          float divisao (float dividendo, float divisor);
          
    };
    
    int calculando::arranjo (int n, int p) // Arranjo
    {
      int arranj = 0;
      while (n >= p)
      {
       n = (n *(n -1));
       p = (p *(p -1));
       arranj = arranjo(n)/ arranjo(n - p);
    };
      return arranj;
    };

    Erros:

    2 D:\C++\TesteC++\calculo.cpp In file included from calculo.cpp

    D:\C++\TesteC++\calculo.h In member function `int calculando::arranjo(int, int)':

    59 D:\C++\TesteC++\calculo.h no matching function for call to `calculando::arranjo(int&)'

    note D:\C++\TesteC++\calculo.h:53 candidates are: int calculando::arranjo(int, int)

    59 D:\C++\TesteC++\calculo.h no matching function for call to `calculando::arranjo(int)'

    note D:\C++\TesteC++\calculo.h:53 candidates are: int calculando::arranjo(int, int)

    D:\C++\TesteC++\G__~1.EXE calculo.o: No such file or directory.

    D:\C++\TesteC++\G__~1.EXE no input files

    Obrigado

  14. :wacko:

    Quando você diz:

    Na recursão você faz uma chamada de arrranjo que não existe com 3 r´s.

    Não entendi a parte do texto em vermelho. Como faço uma chamada de arranjo que não exiiste ? quando faço:

    arranj = arrranjo(n)/ arranjo(n - p);

    não estou chamando a função ? não estou entendendo. Poderia demonstrar ?

    Obrigado

  15. :wacko:

    O que está errado na lógica do método arranjo ? estou usando recursividade, mas também está dando erro na recursividade. Por quê ?

    Arquivo .h
    =========
    class calculando
    {
          public:
          int fatorial (int fat);
          float soma ( float num1, float num2);
          int arranjo (int n, int p);
    };
    
    int calculando::arranjo (int n, int p) // Arranjo
    {
      int arranj = 0;
      while (n >= p)
      {
       n = (n *(n -1));
       p = (p *(p -1));
       arranj = arrranjo(n)/ arranjo(n - p);
    };
      return arranj;
    };.
    Arquivo .cpp ==========
    #include <iostream>
    #include "calculo.h"
    using namespace std;
    int main()
    {
        int Nfat,valorN, valorP;
        float Nsomando1,Nsomando2;
            
       calculando minhaclasse; // definindo a ocorrência da classe calculo
        cout << "Entre com o valor para aplicar o fatorial" << endl;
        cin >> Nfat;
        cout << "fatorial de " << Nfat << endl;
        cout << minhaclasse.fatorial(Nfat)<< endl;
        
        cout << "Entre com Valor de N e Valor de P callcular o arranjo" << endl;
        cin >> valorN;
        cin >> valorP;
        cout << "Valor do Arranjo " << minhaclasse.arranjo (valorN,valorP) << endl;
        
        cout << "Entre com os valore para fazer a soma" << endl;
        cin >> Nsomando1;
        cin >> Nsomando2;
        cout << "Valor da soma de " << Nsomando1 << " + " << Nsomando2 << endl;
        cout << minhaclasse.soma(Nsomando1,Nsomando2) << endl;
        
        system ("pause");
        return 0;
    }

    Obrigado

  16. :(

    Kandrade,

    Ok.

    Mudei para public e deu certo. Mas fique curioso.

    Se não for difícil você poderia criar os métodos set e get em meu código ? não tenho idéia de como fazer isso. Nas apostilas de C++ que peguei na Internet não vi essa abordagem. Só sei, que manter os atributos da classe como private é o mais correto.

    Poderia lançar alguma lluz sobre a criação desses métodos ? Já li algo sobre setw, mas acho que não é disso que se está falando.

    Obrigado

  17. :(

    Estou com dificuldade de criar classes em C++ Estou tendo dificuldades com acesso. Por favor vejam o projeto. Se puderem eliminar ao erros apontados agradeço

    Criei o seguinte projeto o seguinte projeto

    Arquivo metodoestatico.cpp

    #include "metodoestatico.h"
    //---------------------------------------------------------Arquivo main.cpp
    int main ()
    {
    string linha = "--------------------------------------------------------------\n";
     cout << "Entre com o número de alunos da disciplina (ex =3):";
    int numeroAlunos;
    cin >> numeroAlunos;
    cin.get ();
    //Cria um objeto do tipo TPessoa com nome professor
    TPessoa professor;
    //Cria um vetor de objetos alunos do tipo TPessoa
    vector < TPessoa > aluno ( numeroAlunos);
    cout << "Entre com o nome do professor: ";
    getline (cin, professor.nome);
    cout << "Entre com a matricula do professor: ";
    getline (cin, professor.matricula);
    for (int contador = 0; contador < aluno.size (); contador++)
    {
    cout << "Aluno " << contador << endl;
    aluno[contador].Entrada ();
    }
    
    cout << linha;
    cout << "RELAÇÃO DE PROFESSORES E ALUNOS : " << endl;
    cout << linha;
    cout << "Nome do professor: " << professor.nome << "\n";
    cout << "Matricula : " << professor.matricula << "\n";
    for (int contador = 0; contador < aluno.size (); contador++)
    {
    cout << linha;
    cout << "Aluno " << contador << endl;
    aluno[contador].Saida ();
    }
    cin.get ();
    return 0;
    }
    ============================== Arquiivo metodoestático.h
    // ---------------------------------------------------------Arquivo TAluno.h
    // ---------------------------------------------------------Bibliotecas C/C++
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    // ---------------------------------------------------------Classe
    /*
    A classe TPessoa representa uma pessoa (um aluno ou um professor)
    de uma universidade.
    Tem um nome, uma matricula e um IAA.
    E métodos básicos para entrada e saída de dados.
    */
    class TPessoa
    {
    // ---------------------------------------------------------Atributos
    private:
    std::string nome;
    std::string matricula;
    float iaa;
    private:
    static int numeroAlunos;
    public:
    // ---------------------------------------------------------Métodos
    //Método do objeto , altera as propriedades do objeto
    //Leitura dos atributos (nome, matricula)
    void Entrada ();
    //Saida dos atributos ( nome, matricula, iaa)
    void Saida () const;
    //Um método estático só pode alterar atributos estáticos
    static int GetnumeroAlunos ()
    {
    return numeroAlunos;
    }
    };
    /*
    // Atributo estático é aquele que pertence a classe e não ao objeto
    //e precisa ser definido depois da classe
    
    */
    //int TPessoa:: numeroAlunos = 0;
    ‘============================================== Arquivo Taluno.cpp
    #include "metodoestatico.h"
    
    int TPessoa::numeroAlunos = 0;
    //---------------------------------------------------------Arquivo TAluno.cpp
    // Definição dos métodos
    void TPessoa::Entrada ()
    {
      
    cout << "Entre com o nome do aluno: ";
    getline (cin, nome);
    cout << "Entre com a matricula do aluno: ";
    getline (cin, matricula);
    cout << "Entre com o IAA do aluno: ";
    cin >> iaa;
    cin.get ();
    
    }
    void TPessoa::Saida () const
    {
     cout << "Nome do aluno: " << nome << endl;
    cout << "Matricula : " << matricula << endl;
    cout << "iaa : " << iaa << endl;
    }
    Erros: Esta caindo na linha
    std::string nome;

    do arquivo metodoestatico com as seguintes mensagens:

    D:\C++\metodoestatico.h In function `int main()':

    18 D:\C++\metodoestatico.h `std::string TPessoa::nome' is private

    15 D:\C++\metodoestatico.cpp within this context

    19 D:\C++\metodoestatico.h `std::string TPessoa::matricula' is private

    17 D:\C++\metodoestatico.cpp within this context

    18 D:\C++\metodoestatico.h `std::string TPessoa::nome' is private

    27 D:\C++\metodoestatico.cpp within this context

    19 D:\C++\metodoestatico.h `std::string TPessoa::matricula' is private

    28 D:\C++\metodoestatico.cpp within this context

    D:\C++\G__~1.EXE metodoestatico.o: No such file or directory.

    Obriigado

  18. :D

    Considerem, a duas versões do mesmo programa. Ambas funcionam. Foram postas apenas para ilustrar a duvida, e facilitar a resposta.

    Versão 1:

    #include <stdio.h>
    #include <stdlib.h>
    void Escrevenum(int (*func)(int*, int*, int*) );
    int Textonum(int* num1, int* num2, int* num3 );
    int main ()
    
    {
    
       int (*p)(int*, int*, int*); /* Cria ponteiro para a função e define seu
       parametro como tipo char*/
       p = Textonum; /* Atribui a função texto ao ponteiro p*/
       Escrevenum( p ); 
       /* Passa ponteiro para a função como referencia*/
       system ("pause");
       return 0;
    
    }
    void Escrevenum( int (*func)(int*, int*, int*) )
    
    {
         int a=1,b=2,c=3;
         func(&a, &b, &c); 
       
       /* Executa função que foi passada como referencia */
       
       return;
    }
    
    int Textonum(int* num1, int* num2, int* num3 )
    {
       printf("%d %d %d\n", *num1, *num2, *num3);
       return (0);    
    }
    Versão 2:
    #include <stdlib.h>
    void Escrevenum(int (*func)(int, int, int) );
    int Textonum(int num1, int num2, int num3 );
    int main ()
    
    {
    
       int (*p)(int, int, int); /* Cria ponteiro para a função e define seu
       parametro como tipo char*/
       p = Textonum; /* Atribui a função texto ao ponteiro p*/
       Escrevenum( p ); 
       /* Passa ponteiro para a função como referencia*/
       system ("pause");
       return 0;
    
    }
    void Escrevenum( int (*func)(int, int, int) )
    
    {
         func(1, 2, 3); 
       
       /* Executa função que foi passada como referencia */
       
       return;
    }
    int Textonum(int num1, int num2, int num3 )
    {
       printf("%d %d %d\n", num1, num2, num3);
       return (0);    
    }

    Como dito acima, ambas funcionam, entretanto, se diz, que a versão mais correta, é a segunda, isto porque o correto, seria usar ponteiros com parâmetros, quando se usa strings ou tipo char, e não com tipos numéricos. Gostaria de saber o porquê.

×
×
  • Criar Novo...