Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    14

    [C++] Aggiornamento oggetto da contenitore set

    Sto implementando una funzione nella quale una serie di oggetti (con attributo nome, codice) e' inserita in un contenitore set1:
    voglio confrontare il codice di ogni oggetto con gli oggetti di una altro contenitore set2 (con attributi nome, codice); se corrisponde, voglio aggiornare l'attributo nome del set1.
    La ho impostata cosi' :

    [code]

    set <tipo set1>::iterator it1;

    set <tipo set2>::iterator it2;

    for( it1= set1.begin(); it1!=set1.end(); it1++)
    {
    if((*it1).getCodice()== (*it2).getCodice())
    {
    nome=(*it2).getNome();
    (*it1).setNome(nome);
    }
    }
    [\code]

    nelle classi relative agli oggetti inseriti nei set avevo dichiarato come public

    int getCodice() {return codice;}
    e
    void setNome(string n) const {nome=n;}

    mi restituisce l'errore :
    'error passing 'const "tipo set1"' as 'this' argument of void setNome, discards qualifiers

    Non riesco a capire il significato dell'errore.Qualcuno ha un'idea di dove stia sbagliando?
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] Aggiornamento oggetto da contenitore set

    Originariamente inviato da andrga
    int getCodice() {return codice;}
    e
    void setNome(string n) const {nome=n;}

    mi restituisce l'errore :
    'error passing 'const "tipo set1"' as 'this' argument of void setNome, discards qualifiers
    Significa che setNome(), in virtù dello specificatore const, non ha il permesso di modificare i dati interni.

    Corretto è:
    codice:
    int getCodice() const {return codice;}
    void setNome(string n) {nome=n;}
    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
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    14

    Re: Re: [C++] Aggiornamento oggetto da contenitore set

    Originariamente inviato da shodan
    [cut]

    Corretto è:
    codice:
    int getCodice() const {return codice;}
    void setNome(string n) {nome=n;}
    Grazie innanzitutto del tempismo nella risposta.
    Ho provato pero' a togliere 'const' e mi da lo stesso errore.....
    il mio dubbio e': dall'interno di un set di oggetti, si puo' modificare un attributo di un oggetto?
    e l'errore puo' dipendere dall'override degli operatori < e << (per usare il contenitore), dove dichiaro 'const& "classe"?

  4. #4

    Re: Re: Re: [C++] Aggiornamento oggetto da contenitore set

    Originariamente inviato da andrga
    l'errore puo' dipendere dall'override degli operatori < e << (per usare il contenitore), dove dichiaro 'const& "classe"?
    Ehm dove?

    Certo se hai a che fare con un oggetto costante non puoi modicarlo ;-)

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    14

    Re: Re: Re: Re: [C++] Aggiornamento oggetto da contenitore set

    Originariamente inviato da MacApp
    Ehm dove?

    Certo se hai a che fare con un oggetto costante non puoi modicarlo ;-)
    hai ragione, scusa, avevo dimenticato un particolare importante: nella class del "tipo set1"
    nella sezione public:

    [CODE]
    bool operator <("tipo set1" const& "ti") const;
    [\CODE]

    e'l'unico modo che ho trovato per impostare l'override dell'operatore < e usarlo quindi nel contenitore set: esiste anche un modo per evitare l'attribuzione di 'const', e quindi modificare gli attributi?
    grazie in anticipo

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Lo scopo di quell'operatore sarebbe di effettuare un confronto, non di assegnare dati.
    Meglio se posti i dettagli del codice.

    P.S.

    La barra di chiusura del tag code è l'altra.
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    14
    Originariamente inviato da shodan
    Lo scopo di quell'operatore sarebbe di effettuare un confronto, non di assegnare dati.
    Meglio se posti i dettagli del codice.

    P.S.

    La barra di chiusura del tag code è l'altra.
    ok, grazie, eccolo di seguito:

    codice:
    File aula.h
    class aula {
    	private:
    	string nome;
    	int codice;
    	
    	public:
    	aula();
    	virtual ~aula(); 
    	void setNome(string n) {nome=n;}
    	string getNome() const {return nome;}
    	void setCodice(int p) {codice=p;}
    	int getCodice() const {return codice;}
    	bool operator<(aula const&  au) const; //necessario per usare contenitore set
    	friend ostream& operator<<(ostream& a, aula const& au);
    	};
    
    File aula.cpp
    #include "aula.h"
    (......)
    
    bool aula::operator<(aula const& au) const {
    	return codice < au.codice;
    	}
    ostream& operator<<(ostream& a, aula const& au) {
        return a << "aula: " << au.nome << " codice: " << au.codice ;
         };
    
    File MainProgram.cpp
    (dopo aver inserito gli oggetti nel set:)
    
    set<aula>::iterator it_au; //(set1)
    	set<aula2>::iterator it; //(set2)
    	
    	
    	string nom;
    
    	for (it_au= set1.begin(); it_au !=set1.end(); it_au++)
    	  {
    	    for (it= set2.begin(); it != set2.end(); it++)
    	      if ((*it_au).getCodice()== (*it).getCodice()) {
    		    nom=(*it).getNome();
    		    (*it_au).setNome(nom);

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Assegnamenti nelle funzioni const non ne vedo.
    Può essere che il set richieda un operatore di confronto globale. (In genere si scrivono tutti e due)
    codice:
    bool operator<(aula const&  au, aula const& au1) const {
       return au < au1;
    }
    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.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    14
    Originariamente inviato da shodan
    Assegnamenti nelle funzioni const non ne vedo.
    Può essere che il set richieda un operatore di confronto globale. (In genere si scrivono tutti e due)
    codice:
    bool operator<(aula const&  au, aula const& au1) const {
       return au < au1;
    }
    ho provato, adesso mi restituisce, in compilazione ( uso g++ in ambiente linux ) l'errore

    " the operator (const aula&, const aula&) must take exactly one argument"

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    L'hai messo come operatore esterno alla classe?
    (Togli il const finale, ho dimenticato di toglierlo io.)
    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.

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.