Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema programma C++ a oggetti.

    Salve a tutti!
    Ho provato a compilare questo programma in C++, programmato a oggetti, che consiste nell'inserire un numero di tipo int, double o long e restituire il suo valore assoluto in output, usando l'overloading.
    E' la prima volta che uso l'overloading (sono uno studente di 4 superiore) e nel compilare il programma ho 18 errori, anche se non capisco che errori siano.
    Gli errori sono concentrati tutti nei metodi (ovvero nelle funzioni) "output()" del file "ValAss.h" e "ValAss.cpp".

    Questi sono i file:


    ValAss.h:

    class ValAss{

    private:

    int numi;
    double numd;
    long numl;

    public:

    ValAss();
    ~ValAss();
    int output();
    double output();
    long output();
    }

    -------------------------------------------------------------------------------------------------

    ValAss.cpp:

    #include "ValAss.h"
    #include <iostream>
    using namespace std;

    ValAss::ValAss(){

    int a;

    cout << "Vuoi inserire un numero: 1.int \n2.double \n 3.long\n";

    switch (a){
    case 1:
    cout << "Inserisci il valore int: ";
    cin >> numi;
    break;
    case 2:
    cout << "\nInserisci il valore double: ";
    cin >> numd;
    break;
    case 3:
    cout << "\nInserisci il valore long: ";
    cin >> numl;
    break;
    }

    }

    ValAss::~ValAss(){
    cout << "Il distruttore si è distrutto";
    }

    int ValAss:utput(){

    if (numi<0) numi=numi*-1;
    return numi;

    }

    double ValAss:utput(){

    if (numd<0) numd=numd*-1;
    return numd;

    }

    long ValAss:utput(){

    if (numl<0) numl=numl*-1;
    return numl;

    }


    -------------------------------------------------------------------------------------------------

    main.cpp:


    #include "ValAss.h"
    #include <iostream>
    using namespace std;

    int main (int argc, char * const argv[]) {

    ValAss numero;

    cout << "Il valore assoluto del numero immesso è: " << numero.output();

    return 0;
    }


    -------------------------------------------------------------------------------------------------

    Spero possiate aiutarmi :]

    Grazie in anticipo a tutti!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il discriminante dell'overloading si basa sui parametri passati alla funzione, non sul tipo di ritorno.
    Nel tuo caso hai solo void come parametro implicito e il compilatore non sa come scegliere che funzione invocare.
    Le uniche funzioni che vengono discriminate sul tipo di ritorno sono gli operatori di conversione.
    Es:
    codice:
    class ValAss{
        private:
    
            int numi;
            double numd;
            long numl;
    
        public:
    
            ValAss(); 
           ~ValAss();
           operator int();
           operator double();
           operator long();
    }
    
    ...
    
    ValAss numero;
    long L = numero; // chiama operator long()
    int I = numero; // chiama operator int()
    double D = numero; // chiama operator double.
    
    cout << numero << endl; // Errore! Il compilatore non sa che operatore chiamare.
    cout << static_cast<int>(numero) << endl; // OK! Il compilatore invoca operator int()
    
    return 0;
    Tuttavia c'è una tecnica per poter fare l'overloadin sul risultato. La trovi qui:
    http://www.eptacom.net/pubblicazioni/pub_it/nl_7.html
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Originariamente inviato da shodan
    Il discriminante dell'overloading si basa sui parametri passati alla funzione, non sul tipo di ritorno.
    Nel tuo caso hai solo void come parametro implicito e il compilatore non sa come scegliere che funzione invocare.
    Le uniche funzioni che vengono discriminate sul tipo di ritorno sono gli operatori di conversione.
    Es:
    codice:
    class ValAss{
        private:
    
            int numi;
            double numd;
            long numl;
    
        public:
    
            ValAss(); 
           ~ValAss();
           operator int();
           operator double();
           operator long();
    }
    
    ...
    
    ValAss numero;
    long L = numero; // chiama operator long()
    int I = numero; // chiama operator int()
    double D = numero; // chiama operator double.
    
    cout << numero << endl; // Errore! Il compilatore non sa che operatore chiamare.
    cout << static_cast<int>(numero) << endl; // OK! Il compilatore invoca operator int()
    
    return 0;
    Tuttavia c'è una tecnica per poter fare l'overloadin sul risultato. La trovi qui:
    http://www.eptacom.net/pubblicazioni/pub_it/nl_7.html
    Ti ringrazio per la risposta che vedo che hai scritto con impegno, però non sono riuscito a capirla del tutto, o meglio, non ho capito bene quello che hai fatto all'interno del programma, forse perchè non ho ancora conoscenze sufficienti per capire le tue correzioni.
    Comunque grazie ancora per la risposta!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.