1
Marco Tarini Università dell’Insubria
Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2012/13
Computer Graphics Lab
Notes 1: da Java a C++
C++
in C… (ripasso)
void pippo(int i);
/* dichiarazione della funz pippo */
void pippo(int i){
printf(“Ciao %d”,i);
} /* definizione della funz pippo */
file foo.h file foo.c
file main.c
#include “foo.h”
void main(){
pippo(10);
}
precompilatore
(operaz. meramente sintattiche)
in C++ (OO!)
class Foo{
public:
void pippo(int i) { printf(“Ciao %d”,i);
} private:
...
};
file foo.h
file main.c
#include “foo.h”
void main(){
Foo f;
f.pippo(10);
}
si può separare dichiarazione da definizione
class Foo{
public:
void pippo(int i);
// dichiaraz. metodo pippo // (di Foo)
private:
...
};
file foo.h
file main.c
#include “foo.h”
void main(){
Foo f;
f.pippo(10);
}
file foo.cpp (implementazione)
#include “foo.h”
void Foo::pippo(int i){
printf(“Ciao %d”,i);
}
// definiz. metodo pippo di Foo
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
file "main.c"
file "potenze.c"
Un progetto (in C o C++)
• Schema
#include "potenze.h"
int main(){
int x;
x = potenza(5, 6);
}
int potenza(int b,int e) {
int res=1 , i;
for (i=1; i<=e; i++) { res = res * b;
}
return res;
} file "potenze.h"
int potenza(int b,int e);
#include "potenze.h"
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Build di un progetto
main.c
potenze.c potenze.h
pre- process.
precomp. file
1 compiler object main.o file
process. pre-
precomp. file
3 compiler object potenze.o file
eseguibile
finale
exec.exe
linker
2
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Librerie (linking statico)
eseguibile finale exec.exe linker main.c
sorgenti OpenGL di opengl.h
process. pre-
precomp. file
1 compiler object
main.o file
file di libreria (già compilata) opengl32.lib build
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Librerie (dinamiche)
linker main.c
sorgenti OpenGL di opengl.h
process. pre- precomp. file
1 compiler object
main.o file
build
file di libreria (già compilata)
opengl32.lib exec
eseguibile finale exec.exe
shared library, es (in windows):
opengl32.dll
Passaggio di parametri in C (ripasso)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
void pippo_a(int i){ /* i passato per copia */
i = i+5;
}
void pippo_b(int
*i){ /* i passato per COPIA, di puntatore */*i = (*i)+5;
}
int main(){
int x = 5;
pippo_a(x); // x non cambia pippo_b(&x); // x cambia (diventa 10) }
Passaggio di parametri in C++
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
void pippo_a(int i){ /* i passato per copia */
i = i+5;
}
void pippo_b(int
*i){ /* i passato per COPIA, di puntatore */*i = (*i)+5;
}
void pippo_c(int
&i){ /* i passato per riferimento */i = i+5;
}
int main(){
int x = 5;
pippo_a(x); // x non cambia pippo_b(&x); // x cambia (diventa 10) pippo_c(x); // x cambia (diventa 15) }
Passaggio di parametri in C++
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
void pippo_a(int i){ /* i passato per copia */
i = i+5;
}
void pippo_b(const int *i){ /* i passato per COPIA, di puntatore */
*i = (*i)+5;
}
void pippo_c(const int &i){ /* i passato per riferimento */
i = i+5;
}
int main(){
int x = 5;
pippo_a(x); // x non cambia pippo_b(&x); // x cambia (diventa 10) pippo_c(x); // x cambia (diventa 15) }
“giuro che non lo cambio”
// ERRORE di compilaz
// ERRORE di compilaz
Specializzazione in C++
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
class Persona {
public:
Persona() { } int eta;
};
class Studente : public class Persona { public:
Studente() : Persona() { matricola = …;
}
int matricola;
int contaEsami();
};
3
Specializzazione in C++
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
class Persona {
public:
Persona() { } int eta;
};
class Studente : public class Persona { public:
Studente();
int matricola;
int contaEsami();
};
Studente::Studente() : Persona() { /* implementaz costruttore */
matricola = …
… }
int Studente::contaEsami(){
/* implementaz metodo contaEsami */
… }
file Header (.h)
file cpp
Specializzazione in C++
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
class Persona {
public:
Persona() { };
int eta;
};
class Studente : public class Persona { public:
Studente();
int matricola;
int contaEsami() const;
};
Studente::Studente() : Persona() { /* implementaz costruttore */
matricola = …
… }
int Studente::contaEsami() const{
/* implementaz metodo contaEsami */
… }
file Header (.h)
file .cpp
“giuro che non cambio me stesso ”
C++: puntatori
• T
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
class Persona {
public:
Persona(int eta) {
annoNascita = ANNO_CORRENTE - eta;
}
int eta() const {
return annoNascita – ANNO_CORRENTE;
}
int annoNascita;
};
void main(){
Persona pers(29);
pers.annoNascita = 1982;
Persona *pers2 = NULL;
pers2 = &pers;
pers2->annoNascita = 1985;
}
C++: puntatori: new e delete
• T
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 2 / 1 3 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
class Persona {
public:
Persona(int eta) {
annoNascita = ANNO_CORRENTE - eta;
}
int eta() const {
return annoNascita – ANNO_CORRENTE;
}
int annoNascita;
};
void main(){
Persona* p = new Persona(22);
printf(“Anni: %d” , p->eta() );
delete