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

Programa em c++. Classes e construtores. Erro do construtor

Discussão em 'Programação' iniciada por TheRieper, 19 de Fevereiro de 2008. (Respostas: 14; Visualizações: 2175)

  1. TheRieper

    TheRieper Power Member

    Boas tardes meus caros techzonianos. Eu tenho que fazer um programa com uso de classes com funções internas e um construtor. A função interna calcula o produto dos 3 nums, e o construtor calcula a soma dos quadrados dos 3 nums. Um dos nums é privado na classe. O código é o seguinte:
    Código:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    class dados{
    int x;
    public:
    int y,z;
    void setx (int num) {x=num;};
    int getx(){return x;};
    int produto (int n1,int n2, int n3)
    {return (n1*n2*n3);};
    int dados (int n1=1, int n2=1, int n3=1)
    {cout<<n1*n1+n2*n2+n3*n3;};}p1;
    
    main()
    {int skints;
    cout<<"Introduza o valor da variável x: ";
    cin>>skints;
    p1.setx(skints);
    cout<<"Introduza o valor da variável y: ";
    cin>>p1.y;
    cout<<"Introduza o valor da variável z: ";
    cin>>p1.z;
    cout<<p1.produto(p1.getx(), p1.y, p1.z)<<endl;
    dados p1 (skints, p1.y, p1.z);
    getche();}
    
    o erro que dá é o seguinte:
    "14 D:\progs c++\revisoesteste.cpp return type specification for constructor invalid".

    Agradecia uma ajudinha porque isto são revisões para o teste de amanhã e o meu prof é tão bom que dá problemas que não sabe corrigir>.<

    Abraço
     
  2. hYpe

    hYpe [email protected] Member

    Um construtor nao tem tipo de retorno, logo não podes ter int dados(x y z).

    Tira-lhe o 'int'.

    Tens para ai mais umas coisas q eu trocava, mas vai pondo as duvidas conforme elas surgirem.
     
  3. Zaonpt

    Zaonpt Power Member

    offtopic: Hype eu adoro o teu tumb, dead terrorist ftw :)
     
  4. TheRieper

    TheRieper Power Member

    O que tu dizes é para ficar algo assim do genero?:
    Código:
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    class dados{
    int x;
    public:
    int y,z;
    void setx (int num) {x=num;};
    int getx(){return x;};
    int produto (int n1,int n2, int n3)
    {return (n1*n2*n3);};
    dados (int n1=1,int n2=1,int n3=1)
    {cout<<n1*n1+n2*n2+n3*n3;};}p1;
    
    main()
    {int skints;
    cout<<"Introduza o valor da variável x: ";
    cin>>skints;
    p1.setx(skints);
    cout<<"Introduza o valor da variável y: ";
    cin>>p1.y;
    cout<<"Introduza o valor da variável z: ";
    cin>>p1.z;
    cout<<p1.produto(p1.getx(), p1.y, p1.z)<<endl;
    dados p1 (skints, p1.y, p1.z);
    getche();}
    
    Abraço e obrigado pela resposta

    PS: agora dá o seguinte erro: 14 D:\progs c++\revisoesteste.cpp no matching function for call to `dados::dados()'
     
    Última edição: 19 de Fevereiro de 2008
  5. hYpe

    hYpe [email protected] Member

    Tas a pegar nisso de uma maneira errada.

    Deves ter a tua class 'Dados' num ficheiro àparte e a tua classe main noutro.

    Assim, na classe Dados tens:
    - construtor sem parametros = dados();
    - construtor com parametros = dados(int n1, int n2, int n3);
    - destrutor = ~dados();

    Depois repara q tb n puseste tipo de retorno na funçao main.

    Deverá ser int ou então void.
     
  6. TheRieper

    TheRieper Power Member

    mas nós ainda não aprendemos a fazer chamada de ficheiros para usar no programa. supostamente deveriamos fazer isto tudo num só ficheiro, segundo ordens do prof. não há maneira de o fazer? penso que deve haver, só não sei é qual. :/

    Abraço
     
  7. Zaonpt

    Zaonpt Power Member

    em que faculdade estás? posso saber?
     
  8. TheRieper

    TheRieper Power Member

    LOL. Estou na escola secundária António Sérgio, 12º ano, curso tecnológico de informática. faculdade só para o ano:P
     
  9. Zaonpt

    Zaonpt Power Member

    o hype tocou nos pontos mais importantes, mas acho má política teres o p1, como variável global.
    cria a class (devia ser num file à parte) e invocas uma instancia no main:

    dados p1;
     
  10. TheRieper

    TheRieper Power Member

    sim, estou a ver. mas ele continua a dar o mesmo erro, mas agora dá na instância criada. eu ainda nem assimilei muito bem, mas ele esta a dizer que devia chamar o construtor como função membro externa?:S

    Abraço
     
  11. Pauleta_Tubarao

    Pauleta_Tubarao Power Member

    e depois o melhor de tudo é que isto é exercicio de revisoes para o teste que é amanha...
    Ajuda do prof = 0...
     
  12. arconada

    arconada Power Member

    Se fosse eu separava em três ficheiros:

    Dados.h, Dados.cpp e main.cpp

    Os includes desses ficheiros sao faceis: #include "Dados.h" no main.cpp e no Dados.cpp... claro que nao estou a incluir as outras bibliotecas que precises...
     
  13. TheRieper

    TheRieper Power Member

    os dados.h contem a classe certo? e o dados.cpp?

    Abraço
     
  14. mj2p

    mj2p I'm Cool Cuz I Fold

    Oias amigo! Tou a ver que continuas a bater no C++ com toda a força. A sugestão que o arconada te deu é que eu implemento quando faço as minhas aplicações.

    No ficheiro "dados.h" incluem-se apenas os "protótipos" dos métodos da classe. Por exemplo, pegando em duas das tuas funções:

    Código:
    int getx();
    int produto (int n1,int n2, int n3);
    
    Este ficheiro apenas serve para indicar que estas funções existem, já que são apenas específicados o tipo de retorno das funções, o nome das funções e os argumentos das funções. Não é incluido neste ficheiro o código de cada função.

    Já para o ficheiro "dados.cpp", o que será incluido será aquilo que cada função faz, ou seja, o seu código. Pegando nas duas funções que te indiquei:

    Código:
    int dados::getx()
    {
    [INDENT]return x;
    [/INDENT]}
     
    int dados::produto (int n1,int n2, int n3)
    {
    [INDENT]return (n1*n2*n3);
    [/INDENT]}
    
    Repara que para identificar a função como deve ser, primeiro escreve-se o tipo do retorno (para as duas funções int), escreve-se a classe a que pertencem (dados), depois é a vez do operador scope (::) e em seguida o cabeçalho da função.

    No entanto, a primeira linha que vais escrever neste ficheiro é a seguinte:
    Código:
    #include "dados.h"
    
    para assim fazeres a inclusão dos protótipos das funções.

    Quanto ao ficheiro "main.cpp", é o ficheiro em que se faz a definição da função main(). Ou seja, é o ponto de entrada para o programa.

    Bom, espero ter-te esclarecido.

    Vá, cumps
     
  15. TheRieper

    TheRieper Power Member

    Percebi isso bem. Obrigado pela explicação, assim é mais fácil fazer as coisas.

    Abraço

    Mil obrigados. depois de ler bem isto tudo consegui atingir o "eureka" lol:P já tá a funcionar^^
     
    Última edição: 19 de Fevereiro de 2008

Partilhar esta Página