Newsgroup: it.comp.lang.c++
Titolo: Sempre sui vettori di puntatori a classe

Vi posto un pezzetto di codice in cui è contenuto l'errore che
mi sta dando problemi:
main.cpp
--------
#include <iostream>
#include <vector>
#include <cstdlib>
#include "carta.h"
using namespace std;
int main()
{
  vector<carta*> prova;
  carta* uno = new carta(DONNA, ORO);
  carta* due = new carta(ASSO, BASTONI);
  prova.push_back(uno);
  prova.push_back(due);
  for(vector<carta*>::iterator iter = prova.begin(); iter <= prova.end();
iter++)
      cout << *iter->strTornaNome() << endl;
  system("pause");
  return 0;
}
ecco le dichiarazioni ed enumerazioni di carta.h
------------------------------------------------
#ifndef _CARTA_H
#define _CARTA_H
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
enum {ORO, SPADE, COPPE, BASTONI};          //enumerazioni di semi, valori e
valori max
enum {ASSO, DUE, TRE, QUATTRO,
      CINQUE, SEI, SETTE, DONNA, CAVALLO, RE};
enum {MAX_SEME = 3, MAX_VALORE = 9, NUM_CARTE = 39};
class carta {
 private:
 int Valore;
 int Seme;
 public:
 carta();
 carta(int, int);
 inline void SettaValore(int);
 inline void SettaSeme(int);
 inline int intTornaValore();
 inline int intTornaSeme();
 string strTornaValore();
 string strTornaSeme();
 string strTornaNome();
};
/*definizioni*/
#endif _CARTA_H
nel compilare main.cpp, ottengo il seguente errore alla linea 20:
"request for member `strTornaNome' in `*iter', which is of non-aggregate
type `carta *'"
La riga è quella in cui io uso l'operatore -> su *iter
Ma io mi chiedo: se dereferenzio iter, non ottengo un puntatore a carta? E
quindi non è
corretto il modo in cui cerco di accedere alle funzioni membro?
Grazie in anticipo per le vostre delucidazioni, e spero che non si tratti di
una mia banale
dimenticanza, come mi capita spesso ;(
--
Lupin85© - FILSer #2
Founder di #fils
-*Sign in allestimento*-

 La riga č quella in cui io uso l'operatore -> su *iter
Questo
     *iter->strTornaNome() 
č equivalente a
     *( iter->strTornaNome() )
Tu invece volevi scrivere:
      (*iter)->strTornaNome()
Max

       (*iter)->strTornaNome()
giusto, l'avevo appena notato anche io!
ma il problema più grosso è che io devo passarlo ad una funzione.
lo passo, e non va, mi da errore di protezione a runtime
ecco il pezzo di codice:
        for(vector<carta*>::iterator iter = crtGioc.begin(); iter <=
crtGioc.end(); iter++) {
            if(!ConfrontaCarta(*iter, crtGiocataGioc))
                temp.push_back(*iter);
        }
        temp.swap(crtGioc);
        temp.clear();
ed ecco la funzione ConfrontaCarta()
bool ConfrontaCarta(carta* crt1, carta* crt2) {
    if(crt1->intTornaValore() == crt2->intTornaValore() &&
       crt1->intTornaSeme() == crt2->intTornaSeme())
       return TRUE;
    return FALSE;
}
che succede?
--
Lupin85© - FILSer #2 - Founder di #fils
"Non è importante che tu faccia qualcosa di speciale
 ma che tu sia sempre padrone della tua vita"
                                       [Henry James]

 using namespace std;
Negli header e` meglio non mettere mai "using namespace std", si
sporca il namespace globale per tutti i file che includono (anche
indirettamente) l'header.
E` meglio anche includere solo la roba strettamente necessaria.  Non mi
sembra che <cstdlib> e <ctime> servano, a meno che in carta.h non ci
siano altre dichiarazioni che non hai riportato.
        Mauro

         }
Questo codice finisce per dereferenziare l'iteratore restituito da end(),
che č un'operazione non consentita. Il metodo end() dei container standard
non restituisce un iteratore che punta all'ultimo elemento, ma identifica
una "ideale" posizione *oltre* quella dell'ultimo elemento. Si tratta una
generalizzazione del concetto di puntatore past-the-end di un array. La
forma idiomatica per ciclare sugli elementi di un container č
  for( container_type::iterator i = c.begin(); i != c.end(); ++i )
Nota che ho usato l'operatore != e non <.
Max

 siano altre dichiarazioni che non hai riportato.
servono per inizializzare un generatore di numeri casuali.
in effetti ho dimenticato a cancellarli, in quanto la classe mazzo è stata
spostata in un header a parte
grazie mille
--


> ecco il pezzo di codice:

capito! grazie mille!
ora ho risolto quel problema
(certo che non funge ancora praticamente nulla, ma quello č risolto :(  )
--
Lupin85Š - FILSer #2 - Founder di #fils
"Non č importante che tu faccia qualcosa di speciale
