PDA

View Full Version : [C++] Dubbio classe


apocaliv
27-11-2008, 13:20
Salve,
sto seguendo una guida al C++ e ho un dubbio ovviamente sulle classi!!
Praticamente dopo aver letto una guida volevo sapere se una cosa del genere è possibile, l'ho provata ma mi da errore. So che è inutile fare una cosa del genere ma è per capire se si può fare. Poi si può usare invece di calcolo.aria, senza dichirare calcolo, usare Matematica::aria()??? Cmq questo mi da errore di compilazione, "main must return int", "new type can't be definied", "extraneous int ignored". Non capisco il problema forse perchè non ho capito le classi come funzionano!

#include <iostream>
using namespace std;
class Matematica
{
public:
int aria(int x, int y)
{
int risultato=x*y;
return risultato;
}
}
int main()
{
Matematica calcolo;
cout << "Il totale e' " << calcolo.aria(5,6);
return 0;
}



Fatemi sapere.
Bye

||ElChE||88
27-11-2008, 13:51
Hai dimenticato il ; dopo la dichiarazione della classe:

class Matematica
{
public:
int aria(int x, int y)
{
int risultato=x*y;
return risultato;
}
};

cionci
27-11-2008, 14:54
Poi direi area e non aria :D

RaouL_BennetH
27-11-2008, 16:13
scusate l'intromissione :)

Ma in C++ non serve il 'new' per inizializzare le classi ?


Grazie :)

RaouL.

cionci
27-11-2008, 16:17
Non necessariamente, dipende se vuoi creare una variabile allocata staticamente (la cui vita comincia dal punto in cui è dichiarata fino alla fine del blocco) o una variabile allocata dinamicamente (con la new).

RaouL_BennetH
27-11-2008, 16:35
Ah, quindi non è come generalmente avviene per altri linguaggi in cui è necessario dichiarare esplicitamente se la classe sia statica ?

E, (chiedo scusa ancora all'autore per il prolungarsi del mio OT) avviene solo in C++ managed o anche nella versione 'tradizionale' ?

Grazie ancora.

RaouL.

cionci
27-11-2008, 16:45
Quello che ti ho riferito è relativo al C++ normale, il C++ managed non lo conosco.
No, dire che la classe è statica è una cosa dire che una variabile è allocata staticamente è un'altra.

RaouL_BennetH
27-11-2008, 16:51
Scusami ancora :)

quello che non capisco è:



Matematica (classe) calcolo (oggetto) ;



il dubbio che ho non vedendo: 'static Class Matematica' è:



Matematica calcolo = new Matematica();



??

Grazie mille.

RaouL.

cionci
27-11-2008, 17:27
No, non è la stessa cosa. La parola chiave static esiste anche in C++.
Un oggetto in C++ è allocato staticamente quando occupa una posizione di memoria predefinita (rispetto al registro che punta alla base dello stack) e non modificabile. Per memorizzare queste variabili si usa lo stack. Lo scope di questa variabile è dalla posizione di dichiarazione fino alla fine del blocco corrispondente. Il tempo di vita è da quando viene eseguito il prologo della funzione/metodo/oggetto, fino alla fine della funzione/metodo o alla distruzione dell'oggetto.

Matematica calcolo;


Un oggetto è allocato dinamicamente quando si fa uso di new per riservare una zona di memoria (nello heap) dedicata a contenere l'oggetto. La new ritorna l'indirizzo della locazione di memoria riservata che deve essere contenuto all'interno di un puntatore. Lo scope si ottiene attraverso il puntatore "calcolo", la variabile è raggiungibile anche dopo la terminazione della funzione/metodo a patto che rimanga un riferimento al puntatore (ritornato dalla funzione/metodo, immagazzinato nei membri della classe o in un parametro della funzione/metodo passato per riferimento o indirizzo). Il tempo di vita è dalla new fino a quando non richiamo una delete esplicita.

Matematica * calcolo = new Matematica();

javaboy
27-11-2008, 18:16
No, non è la stessa cosa. La parola chiave static esiste anche in C++.
Un oggetto in C++ è allocato staticamente quando occupa una posizione di memoria predefinita (rispetto al registro che punta alla base dello stack) e non modificabile. Per memorizzare queste variabili si usa lo stack. Lo scope di questa variabile è dalla posizione di dichiarazione fino alla fine del blocco corrispondente. Il tempo di vita è da quando viene eseguito il prologo della funzione/metodo/oggetto, fino alla fine della funzione/metodo o alla distruzione dell'oggetto.


Scusa me le variabili memorizzate nello stack non sono variabili automatiche?
come questa x ad esempio:
void fun(){
int x;
}

Le variabili statiche:
void fun(){
static int x;
}
durano oltre la fine della funzione.

Oppure è corretto usare il termine allocato staticamente per tutto ciò che non è allocato dinamicamente con new/malloc come ad esempio le variabili automatiche e le variabili globali?

cionci
27-11-2008, 18:25
C'è differenza fra dire variabile statica e variabile allocata staticamente.
In C++ (e in C) esistono due tipi di allocazione, statica e dinamica.
Le variabili allocate staticamente sono variabili automatiche.
Quelle allocate dinamicamente non sono automatiche, o meglio è automatico l'eventuale puntatore che le indirizza se è allocato staticamente.

int * pippo()
{
int * pluto = new int();
return pluto;
}

Il puntatore pluto è allocato staticamente ed è automatico. L'indirizzo puntato da pluto contiene memoria allocata dinamicamente.

void pluto()
{
static int a;
...
}

a è una variabile statica ed è allocata al momento della creazione dell'immagine in memoria del programma.

void pluto()
{
int a;
...
}

a è una variabile allocata staticamente e automatica.

javaboy
27-11-2008, 18:30
C'è differenza fra dire variabile statica e variabile allocata staticamente.
In C++ (e in C) esistono due tipi di allocazione, statica e dinamica.
Le variabili allocate staticamente sono variabili automatiche.
Quelle allocate dinamicamente non sono automatiche, o meglio è automatico l'eventuale puntatore che le indirizza se è allocato staticamente.

int * pippo()
{
int * pluto = new int();
return pluto;
}

Il puntatore pluto è allocato staticamente ed è automatico. L'indirizzo puntato da pluto contiene memoria allocata dinamicamente.

void pluto()
{
static int a;
...
}

a è una variabile statica ed è allocata al momento della creazione dell'immagine in memoria del programma.

void pluto()
{
int a;
...
}

a è una variabile allocata staticamente e automatica.

Ho ancora un dubbio.
Tu dici che le variabili allocate staticamente sono automatiche.

void fun(){
static int x;
}

Questa è automatica? Una variabile globale è automatica?

cionci
27-11-2008, 18:35
Sono automatiche, solo la loro vita dura dall'inizio alla fine del programma ;)

javaboy
27-11-2008, 18:49
Lo stroustrup distingue 3 tipi di memoria:
Memoria statica:un oggetto è allocato dal collegatore per la durata del programma....

Memoria automatica:argomenti delle funzioni e variabili locali.

Memoria dinamica:nella quale il programma alloca.....

cionci
27-11-2008, 19:07
Ok, ma sono termini, non si è mai sentito dire: alloco un vettore in modo automatico...invece si è sempre sentito dire alloco un vettore in modo statico (e non in riferimento a static). E di persone che mi hanno parlato di C e C++ in 19 anni ne ho viste, professori inclusi.
La terminologia di fatto ed in italiano è questa indipendentemente da Stroustrup.
Nota inoltre che io ho fatto sempre uso del termine "allocazione/allocata" e non memoria. Una variabile automatica è allocata in modo statico. Per me non fa una grinza ;)

Come per la definizione di variabile automatica: cioè una variabile visibile dal punto di dichiarazione e distrutta senza l'intervento diretto del programmatore. Per me anche le variabili globali sono automatiche. E ripeto non sto parlando di memoria.

javaboy
27-11-2008, 19:18
Ok, ma sono termini, non si è mai sentito dire: alloco un vettore in modo automatico...invece si è sempre sentito dire alloco un vettore in modo statico (e non in riferimento a static). E di persone che mi hanno parlato di C e C++ in 19 anni ne ho viste, professori inclusi.
La terminologia di fatto ed in italiano è questa indipendentemente da Stroustrup.
Nota inoltre che io ho fatto sempre uso del termine "allocazione/allocata" e non memoria. Una variabile automatica è allocata in modo statico. Per me non fa una grinza ;)

Come per la definizione di variabile automatica: cioè una variabile visibile dal punto di dichiarazione e distrutta senza l'intervento diretto del programmatore. Per me anche le variabili globali sono automatiche. E ripeto non sto parlando di memoria.
Ok, l'importante è capirsi. Io ero abituato alla notazione "stroustrup" e mi son messo in allarme. Lavori come programmatore c++? Se si in che settore?

cionci
27-11-2008, 19:21
Diciamo che ci ho lavorato ;) Attualmente sono in una fase di transizione ;)
Più che altro ho iniziato molto presto. Il K&R l'ho cominciato a studiare a 12 anni.

DanieleC88
27-11-2008, 22:38
Poi direi area e non aria :D
In effetti... :asd:
Il K&R l'ho cominciato a studiare a 12 anni.
Che precocia! :eekk: