Error: request for member

di il
4 risposte

Error: request for member

Salve a tutti,

sto realizzando il mio primo programma in C++ e mi sono imbattuta in due errori che non riesco a risolvere...
L'esercizio consiste in una classe Costellazione e una classe CorpoCeleste. Una costellazione è un aggregato di corpi celesti.
La classe CorpoCeleste ha 2 membri: un nome e due coordinate, mentre la classe Costellazione possiede un nome e un vettore di puntatori a CorpoCeleste ( vector<CorpoCeleste* > corpi) per implementare l'aggregazione.

Un metodo della classe Costellazione è il seguente:
void Costellazione::removeCorpoCeleste(CorpoCeleste* a)
{
    vector<CorpoCeleste* >::iterator i;
    for(i = corpi.begin(); i <= corpi.end(); i++)
    {
        if(i->getNome() == a.getNome())
        {
            corpi.erase(i);// elimina l'elemento del vettore che si trova nella posizione i
        }
    }
}
però quando vado ad eseguire il programma, mi appaiono i seguenti errori:

error: request for member ‘getNome’ in ‘* i.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> [with _Iterator = CorpoCeleste**, _Container = std::vector<CorpoCeleste*, std::allocator<CorpoCeleste*> >]()’, which is of non-class type ‘CorpoCeleste*’

error: request for member ‘getNome’ in ‘a’, which is of non-class type ‘CorpoCeleste*’
Cosa significa?? Come potrei risolvere il problema??

Grazie mille per il vostro aiuto!

4 Risposte

  • Re: Error: request for member

    if((*i)->getNome() == a->getNome())
    Attenzione all'erase. Io userei erase(remove(.....)) dove per remove intendo un remove_if col utilizzo dei lambda.
    corpi.erase(std::remove_if(corpi.begin(),corpi.end(),
                     [&](CorpoCeleste* i){ return i->getNome() == a->getNome()}),
                     corpi.end());
    p.s.: Untested code

    2° attenzione. Stai rimuovendo il puntatore dal vettore e non l'oggetto il quale rimarra in memoria, quindi pensa bene all'algoritmo di rimozione. Puoi sempre usare un vettore di shared_ptr che è reference counted così quando l'oggetto non viene più usato, viene rimosso automaticamente dalla memoria (viene chiamato il distruttore).
  • Re: Error: request for member

    Grazie! i due errori sono stati risolti!

    Non ho capito perchè sto rimuovendo il puntatore dal vettore e non l'oggetto, potresti spiegarmi meglio per favore?

    Comunque, sostituendo
    corpi.erase(i);
    con
    
    corpi.erase(std::remove_if(corpi.begin(),corpi.end(),
                          [&](CorpoCeleste* i){ return i->getNome() == a->getNome()}),
                           corpi.end());
    
    mi escono i seguenti errori:
    
    error: expected primary-expression before ‘[’ token
    error: expected primary-expression before ‘]’ token
    error: expected primary-expression before ‘*’ token
    
    cosa manca?
    PS: Ho incluso la libreria <algorithm>
  • Re: Error: request for member

    Tu hai un vettore di puntatori ad oggetto, non un vettore di oggetti e quindi quando rimuovi qualcosa dal vettore elimini il puntatore e non l'oggetto puntato. se invece usassi i shared_ptr il tuo vettore diventerebbe:
    vector<std::shared_ptr<CorpoCeleste>> corpi;
    All'eliminazione del shared_ptr questo essendo un puntatore intelligente chiama il distruttore della classe CorpoCeleste quando vede che non è referenziato da nessuno e quindi nessun memory leak.

    Per quanto riguarda l'errore di prima devi verificare se il tuo compilatore supporta i lambda, se no continua ad usare il metodo di prima.
  • Re: Error: request for member

    Ora mi è tutto chiaro...Grazie mille!!
Devi accedere o registrarti per scrivere nel forum
4 risposte