Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [C++] Array di oggetti

  1. #1
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154

    [C++] Array di oggetti

    Salve ragazzuoli.
    Sono incorso in uno strano errore (e non ne riesco a venire a capo da ieri pomeriggio ormai) nel cercare di creare il mio primo "progetto" in C++.

    In pratica volevo simulare una partita a carte...

    Vi riporto le parti importanti del codice:

    header.h
    codice:
    #include <string>
    
    using std::string;
    using namespace std;
    
    class Carta{
    
    private:
    	int numero;
    	string seme;
    	
    public:
    	Carta::Carta(int num, string s);
    	void Carta::stampaCarta();
    	
    };
    
    class MazzoDiCarte{
    	
    	private:
    		Carta mazzo[40];
    		
    	public:
    		MazzoDiCarte::MazzoDiCarte();
    //		Carta* MazzoDiCarte::mischiaMazzo(Carta list[]);
    //		Carta MazzoDiCarte::pescaCarta();
    };
    
    class Partita{
    	
    	public:
    		int prova;
    		
    };
    carta.cpp
    codice:
    #include <string>
    #include <iostream>
    #include "header.h"
    
    using namespace std;
    
    Carta::Carta(int num, string s)
    {
    	numero = num;
    	seme = s;
    }
    
    void Carta::stampaCarta()
    {
    	cout << "Carta: " << numero << " " << seme << endl;
    }
    mazzoDiCarte.cpp
    codice:
    #include <string>
    #include <iostream>
    #include "header.h"
    
    using namespace std;
    
    MazzoDiCarte::MazzoDiCarte()
    {
    	string semeCarta;
    	int i, j;
    
    	for(i=0; i<4; i++)
    	{
    		switch (i)
    		{
    			case 0: semeCarta = "Denari"; break;
    			case 1: semeCarta = "Bastoni"; break;
    			case 2: semeCarta = "Coppe"; break;
    			case 3: semeCarta = "Spade"; break;
    		}
    		
    		for(j=0; j<10; j++)
    		{
    			Carta carta1 = Carta(j+1, semeCarta);
    			mazzo[10*i+j] = carta1;
    //			carta1.stampaCarta();
    		}
    	} // end for esterno
    	
    	//stampa di prova
    	for(i=0; i<40; i++)
    	{
    //cout << "Indirizzo: " << mazzo[i] << " - ";
    		mazzo[i].stampaCarta();
    	}
    }
    Utilizzando un array di puntatori a Carta, tutto va ok, tranne per il fatto che non mi stampa le carte nel secondo ciclo for (quello etichettato con "//stampa di prova"), utilizzando invece un normale array di oggetti Carta, ricevo il seguente errore:
    codice:
     C:\Dev-Cpp\My Projects\PartitaCarte\mazzoDiCarte.cpp In constructor `MazzoDiCarte::MazzoDiCarte()': 
    Linea 8 C:\Dev-Cpp\My Projects\PartitaCarte\mazzoDiCarte.cpp no matching function for call to `Carta::Carta()' 
     note C:\Dev-Cpp\My Projects\PartitaCarte\header.h:6 candidates are: Carta::Carta(const Carta&) 
     note C:\Dev-Cpp\My Projects\PartitaCarte\header.h:6                 Carta::Carta(int, std::string) 
     C:\Dev-Cpp\My Projects\PartitaCarte\Makefile.win [Build Error]  [mazzoDiCarte.o] Error 1
    Potreste darmi una mano?
    Ringrazio anticipatamente

  2. #2
    codice:
    using std::string;
    Non ha senso è un'instruzione inutile (string fa parte di std !): dopo dichiari using namespace std;

    codice:
    public:
    	Carta::Carta(int num, string s);
    	void Carta::stampaCarta();
    non puoi dichiarare Carta::Carta nella classe !? Questa dichiarazione è giusta solo all'esterno !
    Fai cosi
    codice:
    public:
    	Carta(int num, string s);
    	void stampaCarta();
    Stessa cosa vale per MazzoDiCarte !
    [QUOTE]
    codice:
    class Partita{
    	
    	public:
    		int prova;
    		
    };
    Mi sembra inutile dichiarare una classe con una sola variabile !
    Poi il resto mi sembra giusto, ti consiglio di ripassarti bene il C++.


  3. #3
    Originariamente inviato da menphisx
    Non ha senso è un'instruzione inutile (string fa parte di std !): dopo dichiari using namespace std;
    L'istruzione in questione è perfettamente corretta: non importa l'intero namespace std ma solo la classe string.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4

  5. #5
    Mah, a me spesso torna comodo evitare di importare tutto il namespace std (che comprende millemila classi e funzioni) e invece importare solo quello che uso, risparmiandomi l'std:: di fronte a tutta la roba che effettivamente mi serve e evitando al contempo di intasare il namespace globale con roba che non conto di usare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    codice:
    class Partita{
    	
    	public:
    		int prova;
    		
    };
    Mi sembra inutile dichiarare una classe con una sola variabile !
    Poi il resto mi sembra giusto, ti consiglio di ripassarti bene il C++.

    Ah, per la classe partita devo completarla...

    Il C++ non dovrei ripassarlo, ma studiarlo. Il punto è che il C lo so benino, però a lavoro m'hanno chiesto di imparare il C++ in 3 giorni :berto:
    Ho letto in tutta fretta un 300 (di 800) pagine di manuale, ma a quanto pare non ho assimilato molto

  7. #7
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Raga, ho apportato le modifiche che mi avete detto (cioè ho tolto using std::string, Carta:: e CazzoDiCarte:: nella definizione dei metodi delle classi), ma niente, continua a darmi errore:

    codice:
     C:\Dev-Cpp\My Projects\PartitaCarte\mazzoDiCarte.cpp In constructor `MazzoDiCarte::MazzoDiCarte()': 
    8 C:\Dev-Cpp\My Projects\PartitaCarte\mazzoDiCarte.cpp no matching function for call to `Carta::Carta()' 
     note C:\Dev-Cpp\My Projects\PartitaCarte\header.h:6 candidates are: Carta::Carta(const Carta&) 
     note C:\Dev-Cpp\My Projects\PartitaCarte\header.h:6                 Carta::Carta(int, std::string) 
     C:\Dev-Cpp\My Projects\PartitaCarte\Makefile.win [Build Error]  [mazzoDiCarte.o] Error 1
    Vi riporto il main, caso mai dovesse servirvi...
    codice:
    #include <cstdlib>
    #include <iostream>
    #include "header.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	// fondamentale
    	MazzoDiCarte mazzoCarte = MazzoDiCarte();
    	
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Arigrazie!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Alcott
    ... e CazzoDiCarte::

    VVoVe:

    no matching function for call to `Carta::Carta()'
    Non e' definito il costruttore di default

    Carta::Carta()

  9. #9
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Ok ora va. Non avevo capito che fosse obligatorio creare anche il costruttore di default.

    Grazie 1000 a tutti

  10. #10
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Originariamente inviato da Alcott
    ... std::string, Carta:: e CazzoDiCarte:: nella definizione dei metodi delle classi ...
    Non ci avevo fatto caso... però quando ci vuole ci vuole

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 © 2024 vBulletin Solutions, Inc. All rights reserved.