Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48

    Private, public, protected... sto impazzendo

    Salve a tutti,
    Sto lavorando ad un progetto per un esame universitario. Dopoaverlo consegnato, funzionante, giustamente il prof me lo tira dietro dicendo che avevo impostato tutti gli attributi e metodi "public"
    Adesso ho modificato e messo tutto apposto ma, come potevo immaginare, non funziona nulla piu!

    L'errore che mi esce per tutti gli attributi passati da public a private è:
    "error: within this context"

    Non vi chiedo di dirmi come risolvere ma di farmi qualche piccolo esempio per farmi capire queste regole BASI dell'ereditarietà tra classi, in modo da poter usare attributi reciproci.
    Ho letto la guida di html.it ma non ci ho capito grankè...

    GRAZIE A TUTTI!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Farebbe comodo sapere in che linguaggio programmi...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Ciao LeleFT,
    Hai ragionissimo ... Al momento sto utilizzando il C++

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Le regole del C++ non si spiegano con un esempio in un post di un forum ... Si impara studiando dagli opportuni capitoli di un libro (che penso seguirai).

    Sul forum è meglio affrontare *specifici* problemi di codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    codice:
    STAZIONE.H
    
    #ifndef __Stazione_h
    #define __Stazione_h
    #include <map>
    
    using namespace std;
    
    class Stazione
    {
        private:
            int T; // Membro T, tempo di lavorazione della stazione
            int E; // Membro E, tempo di migrazione verso la stazione successiva
            map<int, int> T_migrazione; // Membro t_migrazione, map composta dall'indice della catena da raggiungere e tempo di migrazione verso quella catena
    
        public:
            Stazione(int indiceL, int K, int L, int indiceK);  // Costruttore della classe Stazione
            ~Stazione();  // Distruttore della classe Stazione
    };
    
    #endif // __Stazione.h
    
    
    CATENA.H
    
    #ifndef __Catena_h
    #define __Catena_h
    #include "Stazione.h"
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    class Catena : public Stazione
    {
        private:
            int I;  // Membro I, tempo di ingresso nella stazione
            int U;  // Membro U, tempo di uscita dalla stazione
            int Size; // Membro Size, numero di stazioni presenti nella catena
            vector<Stazione> Stazioni; // Vector contenente tutte le stazioni appartenenti alla catena
    
        public:
            Catena(int L, int K, int indice);  // Costruttore della classe Catena
            ~Catena();  // Distruttore della classe Stazione
    };
    
    #endif // __Catena_h
    
    
    CATENA.CPP
    
    #include "Catena.h"
    #include "Stazione.h"
    #include <vector>
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    Catena::Catena(int L, int K, int indice)
    {
        cout<<"                   CATENA DI MONTAGGIO"<<endl;
        cout<<"                (PROGRAMMAZIONE DINAMICA)"<<endl<<endl;
    
        cout<<"                    STABILIMENTO FIAT"<<endl<<endl;
    
        cout<<"                   Creazione Catena["<<indice+1<<"]"<<endl<<endl;
    
        cout<<"Inserire tempo di ingresso nella catena: "<<endl;
        cin>>this->I;  //Inserimento valore membro I
    
        this->Size = L;  // Copia il valore L, dentro al membro Size
    
        int i;
        for(i=0; i<Size; i++)
        {
            cout<<endl<<"Creazione Stazione["<<i+1<<"]"<<endl;
            Stazione *St = new Stazione(i, K, L, indice); // Tramite un ciclo for, liberiamo memoria e creaiamo le singole Stazioni attraverso il rispettivo costruttore
            this->Stazioni.insert(Stazioni.begin()+i, *St);  // successivamente inseriamo la nuova stazione nel vector
        }
    
        cout<<endl<<"Inserire tempo di uscita dalla catena: "<<endl;
        cin>>this->U;  //Inserimento valore membro U
        cout<<endl;
    
        system("pause");
        system("cls");
    }
    
    
    Catena::~Catena()
    {
    }
    L'errore mi viene dato nel costruttore della classe Catena...

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Errore: no matching function for call to 'Stazione::Stazione()'

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quell'errore indica che non hai dichiarato/definito il costruttore di default per Stazione, il quale non è auto definito dal compilatore a causa del costruttore parametrico.
    Inoltre l'intero impianto delle classi è alquanto bizzarro. Derivi Catena da Stazione, ma tra le due classi non c'è una relazione logica di parentela. Ripassa i concetti di "is a" e "has a" relativi alle classe.
    Inoltre in quel for nel costruttore di Catena stai facendo un errore mastodontico relativo alla memoria: che senso ha usare un puntatore se poi lo deferenzi subito dopo? E la memoria chi la libera?
    Ormai pare sia una moda mettere new da tutte le parti senza curarsi del resto e sperare di passarla liscia. Invece è un errore grave che andrebbe sanzionato col rosso.
    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.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Ho eliminato tutti i collegamenti tra classi e anzichè rendere alcune classi derivate di altre, le ho rese friend, in modo da poter utilizzare gli attributi "private" delle classi base, all'interno dei metodi della classe contenente i metodi principali del progetto.
    Risolto cio, mi torna l'ultimo problema... Il metodo principale del progetto, che torna la soluzione finale del progetto, viene richiamato nel main e giustamente il compilatore mi da errore per 2 attributi che gli do come parametri.
    Esiste un metodo per usare attributi private o protected nel main?

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quote Originariamente inviata da Peppyno Visualizza il messaggio
    Esiste un metodo per usare attributi private o protected nel main?
    Si, si usano appositi metodi getter/setter per accedere ai membri che interessano, senza che sia necessario l'uso di friend.
    Ad esempio:
    codice:
    class Stazione
    {
        typedef map<int,int> ChainMap; // per semplicare
        private:
            int T; // Membro T, tempo di lavorazione della stazione
            int E; // Membro E, tempo di migrazione verso la stazione successiva
            ChainMap T_migrazione; // Membro t_migrazione, map composta dall'indice della catena da raggiungere e tempo di migrazione verso quella catena
    
        public:
            Stazione(int indiceL, int K, int L, int indiceK);  // Costruttore della classe Stazione
            ~Stazione();  // Distruttore della classe Stazione, non serve in questo caso
            int getWorkTime() { return T; }
            int migrationTime() { return E; }
            ChainMap& getChainMap() { return T_migrazione; }
    };
    
    
    int main () {
        Stazione stazione(1,2,3,4);
        cout << stazione.getWorkTime() << endl;
        cout << stazione.getMigrationTime() << endl;
    }
    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.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Ho risolto! Grazie!

    Adesso sto provando la stessa tecnica, però su questa porzione di codice:

    codice:
        x->Getkey() = x->Getkey() + incremento; 
    
        cout<<"La nuova chiave dell'elemento e': "<<x->Getkey()<<endl;   // stampo a video la nuova chiave
    
        InsertABR(x->Getvalore(), x->Getkey());
    Gli attributi "private" sono VALORE e KEY, appartenenti ad un'altra classe.
    Questo è una porzione di codice di un metodo esterno a quella classe. Ho provato a impostare la classe aventi valore e key come friend, ma niente. Ho risolto il cout degli attributi e il passaggio come parametri, attraverso il metodo GET, adesso mi da errore

    "error: lvalue required as left operand of assignment|"

    nella riga in cui provo a effettuare un'operazione aritmetica sul valore x->key che ho richiamato con x->Getkey()...

    Che errore ho commesso qui? Questa tecnica non funziona quando bisogna operare sul valore?
    Ultima modifica di Peppyno; 19-07-2015 a 09:47

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.