View Full Version : [C++] compilare programmini POO: main
mistergks
17-03-2013, 00:10
Sto studiando la programmazione object oriented.
Ho un problema: scrivo le classi che mi servono (separando .h e .cpp cioe interfaccia e implementazione)e per compilare ho bisogno di un MAIN.. qualcuno sa dirmi come va scritto? All'interno di una classe? Un esempio in modo generico!?
mistergks
17-03-2013, 01:31
il main in una classe credo sia una cosa di java et simili. in c++ il main deve essere nel namespace globale, quindi va semplicemente definito in un sorgente come una normalissima funzione. da lì istanzi le tue classi e così via.
Potresti farmi un esempio di main? Come "chiamo" le classi o come le collego con esso?
Inviato dal mio GT-I9003 usando Tapatalk
lorenzo001
17-03-2013, 09:39
Includi i .h con le classi e nel main crei delle istanze
#include <classe1.h>
int main()
{
classe1 istanza;
...
return 0;
}
Ovviamente dovrai indicare al tuo compilatore e al linker di compilare e linkare tutti i .cpp del tuo programma.
mistergks
17-03-2013, 11:24
Includi i .h con le classi e nel main crei delle istanze
#include <classe1.h>
int main()
{
classe1 istanza;
...
return 0;
}
Ovviamente dovrai indicare al tuo compilatore e al linker di compilare e linkare tutti i .cpp del tuo programma.
Istanza sarebbe un oggetto?
Inviato dal mio GT-I9003 usando Tapatalk
mistergks
17-03-2013, 11:33
E le liste o vector presenti nelle classi vanno riempite nel main?
lorenzo001
17-03-2013, 11:53
Che c'entra questo? E' la classe che gestisce i propri attributi interni.
Probabilmente ti manca tutta le teoria di base del C++ ... non penso che delle risposte in un forum ti aiuteranno ... usa un buon libro.
mistergks
17-03-2013, 11:59
Che c'entra questo? E' la classe che gestisce i propri attributi interni.
Probabilmente ti manca tutta le teoria di base del C++ ... non penso che delle risposte in un forum ti aiuteranno ... usa un buon libro.
Uso i due libri di deitel&deitel.. altti consigli?
Inviato dal mio GT-I9003 usando Tapatalk
lorenzo001
17-03-2013, 12:13
altti consigli?
Su cosa?
Scusa ... ma come mai chiedi queste informazioni sul main se stai seguendo dei libri in cui sicuramente ci sono esempi utili ?
vendettaaaaa
17-03-2013, 13:50
Spero sia chiaro che una classe è un tipo di variabile, come "int" o "double".
int a -> a è un oggetto di tipo int.
MyClass b -> b è un oggetto di tipo MyClass.
Tutte le variabili sono sempre oggetti, quindi. Sono istanze di un certo tipo.
Quindi non capisco questa rischiesta sul main...tutti i programmi C++ hanno bisogno di una funzione main, ma non c'è un main apposta per le classi...semplicemente, nel tuo programma (la funzione main) usi variabili di tipo int, MyClass, TuaClasse...
p.s.: altri consigli: Programming: Principles and Practice using C++, di Stroustrup; Accelerated C++, di Koenig e Moo. Entrambi in inglese. Vedi tu.
mistergks
17-03-2013, 14:12
Grazie mille! Volevo sapere questo! Perche avevo visto in giro un main all interno di una classe..
Quindi dal main creo un istanza per ogni classe.. non mi é chiaro il perche devo creare queste istanze.
So che una classe definisce un tipo di dato..
Purtroppo i libri non sempre sono chiari su tutto! Questa cosa del main non la trovo
tomminno
17-03-2013, 14:57
Grazie mille! Volevo sapere questo! Perche avevo visto in giro un main all interno di una classe..
Quindi dal main creo un istanza per ogni classe.. non mi é chiaro il perche devo creare queste istanze.
So che una classe definisce un tipo di dato..
Purtroppo i libri non sempre sono chiari su tutto! Questa cosa del main non la trovo
Escludendo il caso che tu abbia trovato una classe che incidentalmente conteneva un metodo chiamato main, molto più probabilmente ti sei imbattuto in codice C# o Java.
Cosa istanziare nel main dipende dalla logica del tuo programma. Generalmente istanzi una classe che contiene tutta la logica di avvio dell'applicazione.
lorenzo001
17-03-2013, 16:04
Spero sia chiaro che una classe è un tipo di variabile, come "int" o "double".
int a -> a è un oggetto di tipo int.
Tutte le variabili sono sempre oggetti, quindi. Sono istanze di un certo tipo.
Non mi risulta che sia così in C++ ...
lorenzo001
17-03-2013, 16:07
Grazie mille! Volevo sapere questo! Perche avevo visto in giro un main all interno di una classe..
Ma in quale programma C++ l'hai visto?
Ma lo segui il libro o lo hai solamente in libreria ...?
Quindi dal main creo un istanza per ogni classe.. non mi é chiaro il perche devo creare queste istanze.
Te l'ho detto prima ... perché non hai chiare i concetti di base del C++.
Purtroppo i libri non sempre sono chiari su tutto! [quote]
Su classe e istanza è chiaro qualsiasi libro di C++.
[quote]Questa cosa del main non la trovo
Il main è una semplice funzione, come per il C.
The_ouroboros
18-03-2013, 06:59
Java != C++
Prendi un libro di C++, vai a pagina 1 e leggilo, poi torni qui e ne riparliamo :cool:
vendettaaaaa
18-03-2013, 07:31
.. non mi é chiaro il perche devo creare queste istanze.
Istanza di una classe è come dire oggetto.
int a -> a è una istanza del tipo int, cioè una variabile int, cioè un oggetto di tipo int.
@lorenzo: ci sono variabili che non sono oggetti?? Ad esempio?
mistergks
20-03-2013, 17:38
sottopongo alla vostra attenzione questo codice di esempio...per capire come fare a compilare ed eseguire i programmi:
//MAIN.cpp:
#include "Enoteca.h"
#include "BottigliaDiVino.h"
#include <iostream>
using namespace std;
int main()
{
Enoteca e;
BottigliaDiVino a(Barbera,2000,"p1",23);
BottigliaDiVino b(Barbera,2000,"p2",67);
BottigliaDiVino c(Gaglioppo,1900,"p2",67);
BottigliaDiVino d(Merlot,1900,"p2",67);
BottigliaDiVino f(Merlot,1900,"p3",25);
e.aggiungiBottiglia(a);
e.aggiungiBottiglia(b);
e.aggiungiBottiglia(c);
e.aggiungiBottiglia(d);
e.aggiungiBottiglia(f);
list<Vitigno> listaProd= e.vitigniAlmenoDueProduttori();
for(list<Vitigno>::iterator it=listaProd.begin(); it!=listaProd.end(); it++)
cout<<*it<<endl;
return 0;
}
Enoteca.h
#ifndef FRUTTIVENDOLO_H
#define FRUTTIVENDOLO_H
#include "BottigliaDiVino.h"
#include <cstdlib>
#include <iostream>
#include <list>
using namespace std;
class Enoteca
{
private:
list<BottigliaDiVino> vini;
public:
/**
* Il metodo inserisce una bottiglia di vino nell'enoteca,
* in particolare, quando una nuova bottiglia viene inserita
* -Nota: l'inserimento (push_back) va sempre fatto-
* se la bottiglia e' gia' presente in cantina
* ma con prezzo differente, viene
* aggiornato il prezzo di tutte le bottiglie
* uguali (secondo l'operatore== della classe BottigliaDiVino)
* presenti in cantina e il metodo restituisce true
*
* Altrimenti, se non vi e' stato aggiornamento di prezzo
* il metodo restituisce false
*/
bool aggiungiBottiglia(BottigliaDiVino b);
/**
* Restituisce l'annata per la quale in cantina
* e' presente il maggior numero di bottiglie
*
* In caso vi sia piu' di una annata che ha questa caratteristica
* il metodo restituisce quella piu' vecchia
*
* Se la cantina e' vuota il metodo restituisce -1
*/
int annataPiuIngombrante();
/**
* Fissata una annata, il metodo restituisce il
* valore complessivo totale (calcolato come somma dei prezzi)
* di tutti e soli i vini piu costosi di quella annata
*
* Se non vi sono vini in quella annata il metodo
* restituisce -1
*/
int valorePiuCostose(int annata);
/**
* Restituisce la lista dei vitigni per i quali
* in cantina sono presenti bottiglie di almeno
* due produttori
*/
list<Vitigno> vitigniAlmenoDueProduttori();
void stampa();
inline list<BottigliaDiVino>& getContent();
};
list<BottigliaDiVino>& Enoteca::getContent()
{
return vini;
}
#endif
BottigliaDiVino.h
#ifndef BOTTIGLIA_DI_VINO_H_
#define BOTTIGLIA_DI_VINO_H_
#include<string>
#include <iostream>
using namespace std;
enum Vitigno {None = 0, Barbera, Falanghina, Gaglioppo, Malvasia, Merlot, Nebbiolo};
class BottigliaDiVino
{
private:
Vitigno nome;
int annata; //intero >= 1945 e <= 2009
string produttore;
int prezzo; //intero > 10
public:
BottigliaDiVino(Vitigno=None, int=0, string="", int=0);
/* Due "bottiglie" sono uguali se tutti i campi tranne il prezzo sono uguali */
bool operator==(const BottigliaDiVino&) const;
Vitigno getNome() const;
void setNome(Vitigno nome);
int getAnnata() const;
void setAnnata(int annata);
string getProduttore() const;
void setProduttore(string produttore);
int getPrezzo() const;
void setPrezzo(int prezzo);
void stampa()const;
};
#endif
sono 3 files: MAIN.cpp Enoteca.h e BottigliaDiVino.h
in fase di compilazione mi da degli errori: Linker error.
mistergks
20-03-2013, 22:28
Uppino
vendettaaaaa
20-03-2013, 22:46
Se il codice è solo quello, mancano le definizioni delle funzioni membri delle classi. Dovrebbero esserci "BottigliaDiVino.cpp" e "Enoteca.cpp" con dentro le definizioni ad esempio di setPrezzo().
mistergks
20-03-2013, 23:26
Se il codice è solo quello, mancano le definizioni delle funzioni membri delle classi. Dovrebbero esserci "BottigliaDiVino.cpp" e "Enoteca.cpp" con dentro le definizioni ad esempio di setPrezzo().
Si ci sono! Pero non le ho postate!
Inviato dal mio GT-I9003 usando Tapatalk
mistergks
21-03-2013, 10:47
g++ main.cpp BottigliaDiVino.cpp Enoteca.cpp -o MioEseguibile
?
Compilo su windows!
Inviato dal mio GT-I9003 usando Tapatalk
mistergks
21-03-2013, 14:45
con che compilatore? sarebbe piu' semplice aiutarti se tu dessi le informazioni necessarie tutte insieme... :asd:
Ho provato con dev c++, eclipse e codeblock..
Inviato dal mio GT-I9003 usando Tapatalk
vendettaaaaa
21-03-2013, 20:27
Ho provato con dev c++, eclipse e codeblock..
Inviato dal mio GT-I9003 usando Tapatalk
Per favore, usa Visual Studio 2012 Express, lascia perdere il resto :muro:
Cmq il messaggio di errore del linker non è mai solo "linker error" (perlomeno in VS), scrivilo per esteso...
tomminno
22-03-2013, 07:56
dev-c++, eclipse e code::blocks sono degli IDE. ti serve un compilatore. quando si è alle prime armi prendi gcc (o mingw su windows) e COMPILA A MANO.
Alle prime armi meglio di un IDE non c'è niente, specialmente su Windows con Visual Studio Express dove è già tutto bello che pronto.
vendettaaaaa
22-03-2013, 11:46
appunto, è tutto bello che pronto e il 99% di quello che c'è non ti serve. Ci perdi ore solo a capire dove sono le opzioni che ti servono, e se qualcosa non funziona l'unica cosa che sai dire è "non funziona" ... perché? "boh"
Scusa eh, quando si deve consigliare a qualcuno un linguaggio per cominciare a programmare tutti a proporre linguaggi di altissimo livello come Java, Python, perchè permettono di concentrarsi sul codice, sull'algoritmo anzichè sui dettagli di implementazione dovuti al linguaggio.
Quindi analogamente, parlando di strumenti, perchè qualcuno dovrebbe programmare su un text e compilare A MANO anzichè usare l'intellisense per scrivere e poi far compilare tutto a VS? Perchè rinunciare a tutte le "comodità di alto livello" di VS o altri IDE?
tomminno
22-03-2013, 13:22
appunto, è tutto bello che pronto e il 99% di quello che c'è non ti serve. Ci perdi ore solo a capire dove sono le opzioni che ti servono, e se qualcosa non funziona l'unica cosa che sai dire è "non funziona" ... perché? "boh"
Mah veramente quando è tutto pronto, scrivi il codice, premi il tasto play e vai.
Se hai bisogno delle opzioni non sei alle prime armi e a quel punto cerchi una giuda su google. Ma vuoi mettere avere una GUI che comunque ti guida con messaggi umanamente comprensibili?
tomminno
22-03-2013, 13:27
mentre per scrivere su una riga di comando gcc nome -o nome non ci vuole stallman.. certo se devi gestire progetti con migliaia di sorgenti e milioni di righe di codice, una volta che hai idea di cosa sia un IDE e come si usi, usalo pure, ci mancherebbe..
Peccato che su Windows diventi scemo per installarlo.
Con Visual Studio: Avanti->Avanti->Avanti e hai tutto quello che serve fin da subito pronto e funzionante. Hai pure l'intellisense così ti diverti a scoprire cosa c'è negli header standard.
Sarà che hai l'idea che l'IDE è non funzionante di default?
tomminno
22-03-2013, 16:21
quindi il tuo discorso si applica solo a Visual Studio che viene col compilatore di default, per gli altri IDE non vale. prova a configurare visual studio per usare mingw (non so nemmeno se si possa fare, non me lo ricordo piu'), non credo che sia la cosa piu' semplice del mondo ed utile per uno che deve compilare 10 righe di codice...
Con Visual Studio c'è già il suo compilatore che per i più duri e puri può essere usato da linea di comando.
E poi perchè mai uno dovrebbe essere così masochista da usare Visual Studio con mingw? Cosa che tra l'altro non è fattibile se non scrivendo qualche insensato plugin...
Già che siamo su Windows la vita è semplice perchè complicarsela a tutti i costi?
Altri IDE con la pappa pronta? QtCreator anche lui nasce bello che configurato con Visual Studio o mingw.
Comunque nel mondo Java ci sono molti duri e puri che usano solo tool da linea di comando. Sono talmente fighi che quando devono aggiornare le reference di un webservice perdono un paio d'ore al posto dei pochi secondi necessari utilizzando un IDE. Ma loro si che sono programmatori con gli attributi!
In fase di compilazione mi da degli errori: Linker error.
Non puoi sperare che qualcuno ti aiuti se non sei preciso nell'indicare il tuo problema. Riporta TUTTI gli errori, o almeno uno screenshot.
Altrimenti la gente non capisce di cosa parli e il thread (as usual) degenera... :D
tomminno
23-03-2013, 14:34
ma stai parlando in generale degli IDE o solo di visual studio? perche' ripeto, configurarsi un IDE non e' la stessa cosa che prendersi il compilatore e scrivere 7 parole sulla shell, a meno che l'IDE sia gia' configurato.
Forse ti sfugge che gli IDE nacono già preconfigurati e funzionanti.
Quant'è che non ne usi uno?
Netbeans, Visual Studio, QtCreator tutti funzionanti da subito senza necessitare di configurazioni, tra gli IDE più diffusi solo con Eclipse ti manca sempre qualcosa per far funzionare il codice e devi impazzire a scaricare moduli su moduli...
Sono pure tutti gratuiti...
E poi dopo aver compilato come fai il debug?
Dai la soluzione di compilare a mano è fuori da ogni logica!
dov'e' la difficolta' nell'utilizzo di gcc?
dov'è la difficoltà nell'utilizzo di un IDE?
quindi, per usare qtcreator hai bisogno di mingw. tanto vale usare mingw direttamente per compilare queste 10 dannatissime righe di codice, no?
Forse ti sfugge che QtCreator una volta installato e già funzionante ti configura mingw e tutto l'ambiente necessario con tanto di variabili di sistema.
Vuoi sostenere che le interfacce grafiche sono meno usabili di una linea di comando?
E ti ripeto come fai il debug del codice?
Sei sicuro che usando la linea di comando sia più semplice che con un IDE???
quindi? forse non parlo italiano corretto, ma non mi sembra di aver mai scritto da nessuna parte che bisogna lavorare solo da riga di comando. :rolleyes:
by the way, non capisco perche' in questa sezione si debba fare polemica ad ogni costo e su ogni argomento. :mbe:
Boh sei te che suggerisci una strada ben più complicata per fare qualcosa di molto semplice.
Il tuo suggerimento è usare un editor di testo senza nessun supporto al linguaggio (perchè quelli con supporto sono proprio gli IDE...), scrivere il codice e poi aprire una shell (e quindi essersi configurato a mano PATH di sistema per far funzionare qualcosa...) per compilare.
Dimmi te come questo può essere più semplice per uno che comincia rispetto ad un IDE dove hai un editor di testo con intellisense e che per compilare eseguire e debuggare basta un tasto.
Ma da linea di comando è tutto più semplice no? :doh:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.