+ All Categories
Home > Documents > Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Date post: 02-May-2015
Category:
Upload: egidio-volpi
View: 221 times
Download: 0 times
Share this document with a friend
Popular Tags:
187
troduzione al linguaggio C++ Costruzione di tipi di dati del programmatore Costruzione di tipi di dati del programmatore
Transcript
Page 1: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Costruzione di tipi di dati del programmatore

Page 2: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Copyright © 1997 by Mario G. Montobbio

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of the author.

Mario G. Montobbio

mailto:[email protected]

Permission to use, copy and distribute this publication for the purposes of research or private study without fee is hereby granted, provided that this copyright notice and this permission notice appear in all copies.

Page 3: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Linguaggi senza verifica

del tipo degli argomenti

Page 4: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2 CHIAMATO3

Il linguaggio COBOL non verifica che il tipo degli argomenti passati da un modulo CHIAMANTE ad una funzione esterna CHIAMATOx sia quello atteso.

Page 5: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2 CHIAMATO3

In assenza di questo controllo automatico il richiamo ad una funzione esterna CHIAMATOx assomiglia ad una “spina” generica.

Page 6: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2 CHIAMATO3

La “spina” del modulo CHIAMANTE può collegarsi con la “presa” della funzione CHIAMATO1.

Page 7: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1

CHIAMATO2 CHIAMATO3

La “spina” del modulo CHIAMANTE e la “presa” della funzione CHIAMATO1 corrispondono esattamente.

Page 8: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1

CHIAMATO2 CHIAMATO3

Questa è la situazione ideale.

Page 9: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2 CHIAMATO3

La “spina” del modulo CHIAMANTE può collegarsi anche con la “presa” della funzione CHIAMATO2.

Page 10: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1

CHIAMATO2

CHIAMATO3

La “spina” del modulo CHIAMANTE e la “presa” della funzione CHIAMATO2 non corrispondono esattamente, ma – con qualche avvertenza – possono permettere il funzionamento.

Page 11: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1

CHIAMATO2

CHIAMATO3

Questo metodo di richiamo funziona se utilizzo solamente i primi tre “denti” ricevuti da CHIAMANTE ...

Page 12: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1

CHIAMATO2

CHIAMATO3

... ma può causare una fine anomala dell’elaborazione se il programmatore di CHIAMATO2 utilizza il quarto “dente” che non ha mai ricevuto da CHIAMANTE.

Page 13: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2 CHIAMATO3

La “spina” del modulo CHIAMANTE può collegarsi anche con la “presa” della funzione CHIAMATO3.

Page 14: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2

CHIAMATO3

La “spina” del modulo CHIAMANTE e la “presa” della funzione CHIAMATO2 non corrispondono esattamente, ma – con qualche avvertenza – possono permettere il funzionamento.

Page 15: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2

CHIAMATO3

Questo metodo di richiamo funziona se utilizzo solamente il formato del secondo “dente” ricevuto da CHIAMANTE ...

Page 16: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

CHIAMANTE

CHIAMATO1 CHIAMATO2

CHIAMATO3

... ma può causare risultati imprevedibili oppure una fine anomala dell’elaborazione se il programmatore di CHIAMATO3 utilizza la punta del secondo “dente” che non ha mai ricevuto da CHIAMANTE.

Page 17: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio COBOL non verifica il tipo degli argomenti passati ad una funzione esterna.

2. È il programmatore che deve controllare manualmente che la quantità di argomenti e i loro tipi nel modulo CHIAMANTE e nella funzione CHIAMATA1 siano uguali.

3. Solamente l’elaborazione dove la quantità e il tipo degli argomenti sono uguali nel CHIAMANTE e nel CHIAMATO1 è sicura.

4. Talvolta i programmatori COBOL sfruttano l’assenza di verifiche sugli argomenti.

5. Solamente in casi molto particolari (es.: moduli generalizzati, quantità di argomenti variabili) è giustificato lo sfruttamento dell’assenza di verifiche sugli argomenti.

Page 18: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Linguaggi con verifica

del tipo degli argomenti

Page 19: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

Il linguaggio C++ verifica che il tipo degli argomenti passati da un modulo Chiamante ad una funzione esterna Chiamatox sia quello atteso.

Page 20: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

In presenza di questo controllo automatico il richiamo ad una funzione esterna CHIAMATOx assomiglia ad una “spina” specializzata.

Page 21: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

La “spina” del modulo Chiamante può collegarsi con la “presa” della funzione Chiamato1.

Page 22: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1

Chiamato2 Chiamato3

La “spina” del modulo Chiamante e la “presa” della funzione Chiamato1 corrispondono esattamente.

Page 23: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1

Chiamato2 Chiamato3

Questa è la situazione ideale.

Page 24: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

La “spina” del modulo Chiamante NON può collegarsi anche con la “presa” della funzione Chiamato2 ...

Page 25: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

... infatti il modulo Chiamante NON passa il quarto argomento atteso dalla funzione Chiamato2.

Page 26: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

Il richiamo dal modulo Chiamante alla funzione esterna Chiamato2 non è un richiamo sicuro

Chiamante

Page 27: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

La “spina” del modulo Chiamante NON può collegarsi anche con la “presa” della funzione Chiamato3 ...

Page 28: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

... infatti il secondo argomento passato dal modulo Chiamante NON è dello stesso tipo del secondo argomento atteso dalla funzione Chiamato3.

Page 29: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Chiamante

Chiamato1 Chiamato2 Chiamato3

Il richiamo dal modulo Chiamante alla funzione esterna Chiamato3 non è un richiamo sicuro

Chiamante

Page 30: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio C++ verifica il tipo degli argomenti passati ad una funzione.

2. Il programmatore non deve più controllare manualmente che la quantità di argomenti e i loro tipi nel modulo Chiamante e nella funzione Chiamato1 siano uguali: ci pensa il compilatore.

3. Il linguaggio C++ permette di creare tipi di argomenti del programmatore per sfruttare la verifica del tipo degli argomenti.

4. È sicura solamente l’elaborazione dove la quantità di argomenti è uguale ed i tipi degli argomenti sono uguali o compatibili nel Chiamante e nel Chiamato1.

5. I casi particolari (es.: moduli generalizzati, quantità di argomenti variabili) possono essere risolti mediante costruzioni del linguaggio C++ che non evitano il controllo dei tipi degli argomenti (es.: gerarchia tipi-sottotipi, contenitori).

Page 31: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

Mancanza di modello delle funzioni esterne

Page 32: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

Questo è un esempio di dichiarazione di aree nel modulo CHIAMANTE scritto in linguaggio COBOL.

Page 33: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

Queste clausole specificano i tipi di dati delle aree ...

Page 34: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

... che hanno questi nomi (definiti dal programmatore).

Page 35: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-MAX,

4 REQ-LIM,

5 REQ-IND.

... ...

Se passiamo le tre aree definite nel modulo CHIAMANTE come argomenti ad una funzione esterna CHIAMATO ...

Page 36: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

... è il programmatore che deve manualmente verificare che in CHIAMATO l’ordine di definizione degli argomenti ricevuti ...

1

2

3

Page 37: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-MAX,

4 REQ-LIM,

5 REQ-IND.

... ...

... corrisponda a quello della chiamata a funzione esterna nel modulo CHIAMANTE.

1

2

3

Page 38: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

È il programmatore che deve manualmente verificare che in CHIAMATO i tipi degli argomenti ...

Page 39: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

... corrispondano a quelli passati dal modulo CHIAMANTE.

Page 40: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

Problema: La quantità e l’ordine degli argomenti della funzione esterna CHIAMATO ed il loro tipo NON sono sintetizzati in un modello di funzione ...

Page 41: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-MAX,

4 REQ-LIM,

5 REQ-IND.

6 ...

... che sia disponibile durante la compilazione del modulo CHIAMANTE e che permetta al compilatore di verificare automaticamente che la quantità e l’ordine degli argomenti passati da CHIAMANTE a CHIAMATO ...

1

2

3

Page 42: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

... ed i loro tipi corrispondano.

Page 43: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Mancanza di modello delle funzioni esterne

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio COBOL non verifica durante la compilazione il tipo degli argomenti passati ad una funzione, poiché le funzioni esterne non hanno un modello.

2. Il programmatore deve controllare manualmente che la quantità di argomenti nel richiamo alla funzione CHIAMANTE1 nel modulo CHIAMANTE e nella lista di argomenti di CHIAMANTE1 siano uguali.

3. Il programmatore deve controllare manualmente che i tipi degli argomenti nel modulo CHIAMANTE e nel modulo CHIAMATO1 siano uguali.

Page 44: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inconvenienti della mancanza di modello

Inconvenienti della mancanza di modello

Page 45: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

Errore Nr. 1

Omissione di un argomento

Page 46: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-LIM,

4 REQ-IND.

... ...

Se per errore il programmatore omette REQ-MAX nel richiamo a CHIAMATO ...

Page 47: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

... sarebbe comodo che il compilatore confrontasse il richiamo (in CHIAMANTE) con il modello di CHIAMATO e ci avvertisse dell’omissione dell’argomento.

Page 48: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-LIM,

4 REQ-IND.

... ...

Problema: Il compilatore non può segnalarci l’errore poiché CHIAMANTE non conosce il modello di CHIAMATO.

Page 49: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio COBOL non identifica durante la compilazione l’omissione di un argomento che deve essere passato ad una funzione, poiché le funzioni esterne non hanno un modello.

2. Il programmatore deve controllare manualmente nel modulo CHIAMANTE che la quantità di argomenti nel richiamo alla funzione CHIAMATO1 sia uguale a quelli attesi dalla funzione CHIAMATO1.

Page 50: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

Errore Nr. 2

Inversione di due argomenti

Page 51: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-LIM,

4 REQ-MAX,

5 REQ-IND.

... ...

Se per errore il programmatore inverte REQ-MAX e REQ-LIM nel richiamo a CHIAMATO ...

Page 52: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-LIM,

4 REQ-MAX,

5 REQ-IND.

... ...

... il compilatore non può segnalarci l’errore poiché CHIAMANTE non conosce il modello di CHIAMATO.

Page 53: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

In questo caso – anche se confrontassimo il richiamo col modello di CHIAMATO – l’inversione degli argomenti è ancora più difficile da rilevare poiché sono entrambi dello stesso tipo: PIC S9(9) COMP.

Page 54: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

Esaminando i nomi delle aree, notiamo che le aree rappresentano concetti diversi ...

Page 55: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

REQ-MAX è un valore massimo ...

Page 56: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

... mentre REQ-LIM è un valore in uso.

Page 57: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

Sarebbe utile che il compilatore ci permettesse di distinguere fra un valore massimo e un valore in uso ...

Page 58: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

... e confrontasse il richiamo (in CHIAMANTE) con il modello di CHIAMATO e ci avvertisse dell’inversione degli argomenti.

Page 59: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMATO.

... ...

3 LINKAGE SECTION.

4 01 ZZ-REQ-MAX PIC S9(9) COMP.

5 01 ZZ-REQ-LIM PIC S9(9) COMP.

6 01 ZZ-REQ-IND PIC S9(9) COMP.

7 PROCEDURE DIVISION USING ZZ-REQ-MAX,

8 ZZ-REQ-LIM,

9 ZZ-REQ-IND.

... ...

Per distinguere automaticamente ZZ-REQ-MAX e ZZ-REQ-LIM in base al tipo di dato, dovremmo potere sostituire S9(9) COMP con un tipo di dato definito dal programmatore.

Page 60: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

Problema: I possibili tipi sono già pre-definiti nel linguaggio COBOL e non è possibile creare nuovi tipi definiti dal programmatore.

Page 61: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio COBOL non identifica durante la compilazione l’inversione di due argomenti passati ad una funzione, poiché le funzioni esterne non hanno un modello.

2. Il programmatore deve controllare manualmente nel modulo CHIAMANTE che la quantità di argomenti nel richiamo alla funzione CHIAMATO1 sia uguale alla quantità attesa dalla funzione CHIAMATO1.

4. Il linguaggio COBOL non permette di creare tipi di dati del programmatore, e quindi non potrebbe comunque sfruttare la verifica del tipo degli argomenti per distinguere l’inversione di due argomenti che hanno lo stesso tipo – PIC S9(9) COMP – pre-definito nel linguaggio.

3. Il programmatore deve controllare manualmente che i tipi degli argomenti nel modulo CHIAMANTE e nel modulo CHIAMATO1 siano uguali.

Page 62: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

Errore Nr. 3

Scambio di aggregato in argomento

Page 63: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

REQ-AREA è un aggregato di aree costruito seconde le necessità del programmatore, ma non è un nuovo tipo di dato.

Page 64: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING REQ-AREA.

... ...

Possiamo richiamare una versione modificata di CHIAMATO passando come argomento un aggregato REQ-AREA ...

Page 65: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING OTHER-AREA.

... ...

Ma se – per errore – nel richiamo a CHIAMATO il programmatore passa l’aggregato OTHER-AREA al posto di REQ-AREA ...

Page 66: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 CALL “CHIAMATO” USING OTHER-AREA.

... ...

... il compilatore non ci può avvertire ...

Page 67: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 IDENTIFICATION DIVISION.

2 PROGRAM-ID. CHIAMANTE.

... ...

3 WORKING-STORAGE SECTION.

... ...

11 01 OTHER-AREA.

12 10 OTHER-NAME PIC X(9)

13 VALUE “FERRUCCIO”.

14 10 OTHER-ROLE PIC X(8)

15 VALUE “THE BEST”.

... poiché – a parte l’assenza di modello – anche OTHER-AREA è un aggregato di aree come REQ-AREA.

Page 68: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

3 WORKING-STORAGE SECTION.

4 01 REQ-AREA.

5 10 REQ-MAX PIC S9(9) VALUE +10 COMP.

6 * Quantity of foreseen iteration requests.

7 10 REQ-LIM PIC S9(9) VALUE ZERO COMP.

8 * Quantity of iteration requests in use.

9 10 REQ-IND PIC S9(9) VALUE ZERO COMP.

10 * Index to the current iteration request.

11 01 OTHER-AREA.

12 10 OTHER-NAME PIC X(9)

... ...

Problema: Nel linguaggio COBOL non è possibile creare nuovi tipi di dati aggregati definiti dal programmatore, e distinguere gli aggregati in base al loro tipo.

Page 69: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

Riepilogo: In questa discussione abbiamo visto che:

1. Il linguaggio COBOL non identifica durante la compilazione la sostituzione per errore di un argomenti passato ad una funzione, poiché le funzioni esterne non hanno un modello.

2. Il programmatore deve controllare manualmente nel modulo CHIAMANTE che il formato dell’argomento nel richiamo alla funzione CHIAMATO sia quello atteso dalla funzione CHIAMATO.

3. Il linguaggio COBOL non permette di creare tipi di dati aggregati del programmatore, e quindi non potrebbe comunque sfruttare la verifica del tipo degli argomenti per distinguere l’inversione di due argomenti che siano entrambi aggregati.

Page 70: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

Presenza di modello delle funzioni

Page 71: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Questo è un esempio di dichiarazione di aree e di richiamo alla funzione Chiamato nella funzione Chiamante scritta in linguaggio C++.

Page 72: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Queste clausole specificano i tipi di dati delle aree ...

Page 73: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... che hanno questi nomi (definiti dal programmatore).

Page 74: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Se passiamo le tre aree definite nella funzione Chiamante come argomenti ad una funzione Chiamato ...

Page 75: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... il compilatore può automaticamente verificare che l’ordine di definizione degli argomenti ricevuti nel richiamo alla funzione Chiamato ...

1 2 3

Page 76: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... sia uguale a quello definito nel modello delle funzione Chiamato ...

1 2 3

Page 77: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... che è contenuto nell’intestazione Chiamato.h

1

2

3

Page 78: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Il compilatore ricerca il tipo del primo argomento Req_Max ...

Page 79: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h“

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... che è dichiarato nel corpo della funzione Chiamante ...

1

23

Page 80: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h“

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... ed è definito nell’intestazione Maximum.h.

1

2

4

3

Page 81: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Nell’intestazione Maximum.h con la parola riservata class il programmatore definisce un nuovo tipo di dato Maximum ...

Page 82: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

... che può essere usato per dichiarare un’area di tipo Maximum nel corpo della funzione Chiamante ...

Page 83: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... e può essere usato nell’intestazione Chiamato.h per definire il tipo del primo argomento theMaximum della funzione Chiamato.

Page 84: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Nel modello della funzione Chiamato ...

Page 85: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... il primo argomento fittizio theMaximum ...

1

Page 86: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è di tipo Maximum ...

12

Page 87: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... e corrisponde all’argomento reale Req_Max ...

12

3

Page 88: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... che è dichiarato nel corpo della funzione Chiamante ...

12

3

4

Page 89: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... di tipo Maximum.

12

3

45

Page 90: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Poiché l’argomento reale Req_Max e quello formale theMaximum appartengono allo stesso tipo di dato Maximum ...

1

2

Page 91: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è possibile passare Req_Max come primo argomento alla funzione Chiamato.

1

2

3

Page 92: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Analogamente il secondo argomento reale Req_Lim passato alla funzione Chiamato ...

Page 93: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è dichiarato nel corpo della funzione Chiamante ...

1

2

Page 94: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... ed è di tipo Limit.

23

1

Page 95: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... proprio come il secondo argomento formale theLimit nel modello della funzione Chiamato.

4

23

1

Page 96: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Il tipo di dato del programmatore Limit è definito nell’intestazione Limit.h ...

Page 97: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __LIMIT_H

2 #define __LIMIT_H

3 class Limit

4 {// File: Limit.h

5 public:

6 Limit (void);

7 Limit (int theLimit);

8 Limit (Limit &theLimit_Ref);

9 ~Limit (void);

10 Limit& operator=(Limit &theLimit_Ref);

... ...

11 };

12 #endif // __LIMIT_H

... con la parola riservata class seguita dal nome del nuovo tipo di dato Limit.

Page 98: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Poiché l’argomento reale Req_Lim e quello formale theLimit appartengono allo stesso tipo di dato Limit ...

1

2

Page 99: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è possibile passare Req_Lim come secondo argomento alla funzione Chiamato.

12

3

Page 100: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Analogamente il terzo argomento reale Req_Ind passato alla funzione Chiamato ...

Page 101: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è dichiarato nel corpo della funzione Chiamante ...

1

2

Page 102: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... ed è di tipo Index.

3

1

2

Page 103: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... proprio come il terzo argomento formale theIndex nel modello della funzione Chiamato.

4

3

1

2

Page 104: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Il tipo di dato del programmatore Index è definito nell’intestazione Index.h ...

Page 105: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __INDEX_H

2 #define __INDEX_H

3 class Index

4 {// File: Index.h

5 public:

6 Index (void);

7 Index (int theIndex);

8 Index (Limit &theIndex_Ref);

9 ~Index (void);

10 Index& operator=(Index &theIndex_Ref);

... ...

11 };

12 #endif // __INDEX_H

... con la parola riservata class seguita dal nome del nuovo tipo di dato Index.

Page 106: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Poiché l’argomento reale Req_Ind e quello formale theIndex appartengono allo stesso tipo di dato Index ...

1

2

Page 107: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

... è possibile passare Req_Ind come terzo argomento alla funzione Chiamato.

1

2

3

Page 108: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Nell’intestazione Maximum.h con la parola riservata class il programmatore definisce la forma del primo “dente”.

Chiamante

Chiamato

Page 109: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __LIMIT_H

2 #define __LIMIT_H

3 class Limit

4 {// File: Limit.h

5 public:

6 Limit (void);

7 Limit (int theLimit);

8 Limit (Limit &theLimit_Ref);

9 ~Limit (void);

10 Limit& operator=(Limit &theLimit_Ref);

... ...

11 };

12 #endif // __LIMIT_H

Nell’intestazione Limit.h con la parola riservata class il programmatore definisce la forma del secondo “dente”.

Chiamante

Chiamato

Page 110: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __INDEX_H

2 #define __INDEX_H

3 class Index

4 {// File: Index.h

5 public:

6 Index (void);

7 Index (int theIndex);

8 Index (Limit &theIndex_Ref);

9 ~Index (void);

10 Index& operator=(Index &theIndex_Ref);

... ...

11 };

12 #endif // __INDEX_H

Nell’intestazione Index.h con la parola riservata class il programmatore definisce la forma del terzo “dente”.

Chiamante

Chiamato

Page 111: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

L’ordine dei tre argomenti nel richiamo a Chiamato definisce l’ordine dei “denti” nella “spina” Chiamante.

Chiamante

Chiamato

1 2 3

1 2 3

Page 112: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

L’ordine dei tre argomenti nel modello della funzione Chiamato definisce l’ordine dei “denti” nella “presa” Chiamato.

Chiamante

Chiamato4 5 6

4

5

6

Page 113: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Presenza di modello delle funzioni

... ...

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

... ...

8 Maximum Req_Max(10); // Qty foreseen requests

9 Limit Req_Lim; // Qty requests in use

10 Index Req_Ind; // Index to curr. request

11 Chiamato (Req_Max, Req_Lim, Req_Ind);

... ...

Le forme della “spina” Chiamante e della “presa” Chiamato corrispondono esattamente.

Chiamante

Chiamato

1 2 3

4 5 6

1

2

3

4

5

6

Page 114: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

Errore Nr. 1

Omissione di un argomento

Page 115: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Lim, Req_Ind);

11 }

Il compilatore può automaticamente verificare che la quantità degli argomenti ricevuti nel richiamo alla funzione Chiamato ...

1 2

Page 116: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Omissione di un argomento

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... non corrisponde nell’intestazione Chiamato.h alla quantità di argomenti definiti nel modello della funzione Chiamato.

1

2

3

Page 117: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

Errore Nr. 2

Inversione di due argomenti

Page 118: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Lim, Req_Max, Req_Ind);

11 }

Se per errore il programmatore inverte Req_Max e Req_Lim nel richiamo a Chiamato ...

AB C

Page 119: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inversione di due argomenti

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

... il compilatore può automaticamente verificare che i tipi del primo e del secondo argomento ricevuti nel richiamo alla funzione Chiamato non corrispondono nell’intestazione Chiamato.h ai tipi degli argomenti definiti nel modello della funzione Chiamato.

A

B

C

Page 120: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

Errore Nr. 3

Scambio di aggregato in argomento

Page 121: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Lim, Req_Max, Req_Ind);

11 }

Poiché il compilatore C++ distingue fra i tipi degli aggregati l’errore Nr. 3 viene riconosciuto esattamente come l’errore Nr. 2.

AB C

Page 122: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Scambio di aggregato in argomento

1 #ifndef __CHIAMATO_H

2 // File: Chiamato.h

3 #define __CHIAMATO_H

4 void Chiamato (Maximum theMaximum

5 ,Limit theLimit

6 ,Index theIndex);

7 #endif // __CHIAMATO_H

Il compilatore può automaticamente verificare se i tipi degli argomenti ricevuti nel richiamo alla funzione Chiamato corrispondono nell’intestazione Chiamato.h ai tipi degli argomenti definiti nel modello della funzione Chiamato.

A

B

C

Page 123: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Componenti di un dato del programmatore

Page 124: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Ci sono alcuni componenti di servizio che compaiono frequentemente nei tipi di dati definito dal programmatore.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

1

2

3

4

5

6

7

Page 125: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Il metodo di inizializzazione “minima” ci permette di costruire un dato valido del tipo definito dal programmatore senza conoscere alcun valore.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

1

Page 126: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

I metodi di inizializzazione “migliori” ci permettono di costruire un dato del tipo definito dal programmatore partendo da valori in argomento.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

2

Page 127: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Il metodo di inizializzazione per copia ci permette di passare un dato ad una funzione e di farcelo restituire da una funzione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

3

Page 128: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Il metodo di rilascio delle risorse permette di liberare le aree occupate dal tipo di dato e di rilasciare le risorse impegnate dai metodi di inizializzazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

4

Page 129: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Il metodo di assegnazione permette di assegnare un dato del tipo definito dal programmatore ad un altro dato dello stesso tipo.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

5

Page 130: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Un metodo di copia (ad uso interno) viene richiamato dal metodo di inizializzazione per copia e dal metodo di assegnazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

6

Page 131: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Un metodo di rilascio (ad uso interno) viene richiamato dal metodo (pubblico) di rilascio delle risorse impegnate e dal metodo di assegnazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)7

Page 132: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione “minima”

Inizializzazione “minima”

Page 133: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione “minima”

Il metodo di inizializzazione “minima” ci permette di costruire un dato valido del tipo definito dal programmatore senza conoscere alcun valore.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

1

Page 134: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione “minima”

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Questo è un esempio di dichiarazione “minima” di un dato Req_Lim di tipo Limit (definito dal programmatore) ...

Page 135: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione “minima”

1 #ifndef __LIMIT_H

2 #define __LIMIT_H

3 class Limit

4 {// File: Limit.h

5 public:

6 Limit (void);

7 Limit (int theLimit);

8 Limit (Limit &theLimit_Ref);

9 ~Limit (void);

10 Limit& operator=(Limit &theLimit_Ref);

... ...

11 };

12 #endif // __LIMIT_H

... e questo è il metodo che viene richiamato per inizializzare il dato di tipo Limit.

Page 136: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione “minima”

1 #ifndef __LIMIT_H

2 #define __LIMIT_H

3 class Limit

4 {// File: Limit.h

5 public:

6 Limit (void);

7 Limit (int theLimit);

8 Limit (Limit &theLimit_Ref);

9 ~Limit (void);

10 Limit& operator=(Limit &theLimit_Ref);

... ...

11 };

12 #endif // __LIMIT_H

Poiché non partiamo da argomenti di nessun tipo non possiamo che inizializzare il dato con valori “minimi” validi.

Page 137: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazioni “migliori”

Inizializzazioni “migliori”

Page 138: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazioni “migliori”

I metodi di inizializzazione “migliori” ci permettono di costruire un dato del tipo definito dal programmatore partendo da valori in argomento.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

2

Page 139: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazioni “migliori”

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Questo è un esempio di dichiarazione “migliore” di un dato Req_Max di tipo Maximum (definito dal programmatore) ...

Page 140: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazioni “migliori”

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Limit &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

... e questo è il metodo che viene richiamato per inizializzare il dato di tipo Maximum.

Page 141: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

Inizializzazione per copia

Page 142: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

Il metodo di inizializzazione per copia ci permette di passare un dato ad una funzione e di farcelo restituire da una funzione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

3

Page 143: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Questo è un esempio di passaggio di un dato Req_Max di tipo Maximum (definito dal programmatore) in argomento alla funzione Chiamato.

Page 144: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Il compilatore richiama automaticamente il metodo di inizializzazione per copia specifico per il tipo di dato Maximum per creare l’argomento da passare alla funzione Chiamato.

Page 145: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Questo è il metodo che inizializza la copia del dato di tipo Maximum che viene passata in argomento alla funzione Chiamato.

Page 146: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Inizializzazione per copia

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Solamente un metodo del tipo di dato Maximum può costruire una copia “sicura” di un dato del suo tipo.

Page 147: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

Rilascio risorse impegnate

Page 148: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

Il metodo di rilascio delle risorse permette di liberare le aree occupate dal tipo di dato e di rilasciare le risorse impegnate dai metodi di inizializzazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

4

Page 149: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Quando viene raggiunta la chiusa graffa } il dato Req_Max di tipo Maximum esce dal suo ambito di visibilità e viene automaticamente distrutto dal compilatore.

Page 150: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Prima di rilasciare le aree occupate dal tipo di dato definito dal programmatore, il compilatore richiama il metodo di rilascio delle risorse dello specifico tipo di dato.

Page 151: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Questo è il metodo che rilascia le risorse impegnate dai metodi di inizializzazione dei dati di tipo Maximum.

Page 152: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Solamente un metodo del tipo di dato Maximum può rilasciare correttamente le risorse impegnate dai suoi metodi di inizializzazione.

Page 153: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Per ogni tipo di dato definito dal programmatore il metodo di rilascio è unico.

Page 154: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Ogni metodo di inizializzazione deve annotare quali risorse ha impegnato perché l’unico metodo di rilascio le possa correttamente rilasciare.

Page 155: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio risorse impegnate

1 #include “Chiamato.h”

2 #include “Maximum.h”

3 #include “Limit.h”

4 #include “Index.h”

5 void Chiamante (void)

6 {

7 Maximum Req_Max(10); // Qty foreseen requests

8 Limit Req_Lim; // Qty requests in use

9 Index Req_Ind; // Index to curr. request

10 Chiamato (Req_Max, Req_Lim, Req_Ind);

11 }

Dopo avere richiamato il metodo di rilascio delle risorse dello specifico tipo di dato, il compilatore rilasciare le aree occupate dal tipo di dato definito dal programmatore.

Page 156: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Assegnazione

Page 157: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Il metodo di assegnazione permette di assegnare un dato del tipo definito dal programmatore ad un altro dato dello stesso tipo.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

5

Page 158: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Temp_Max = Req_Max;

... ...

7 }

Il programmatore dichiara un dato Req_Max di tipo Maximum e lo inizializza con il valore 10.

Page 159: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Temp_Max = Req_Max;

... ...

7 }

Il programmatore dichiara un dato temporaneo Temp_Max di tipo Maximum e lo inizializza al “minimo”.

Page 160: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Temp_Max = Req_Max;

... ...

7 }

Il “valore” di Req_Max è assegnato a Temp_Max, dato dello stesso tipo (definito dal programmatore).

Page 161: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Temp_Max = Req_Max;

... ...

7 }

Quando viene raggiunta la chiusa graffa } i dati Req_Max e Temp_Max di tipo Maximum escono dal loro ambito di visibilità e vengono automaticamente distrutti dal compilatore.

Page 162: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Temp_Max = Req_Max;

... ...

7 }

Se l’assegnazione specifica del tipo di dato Maximum non è corretta l’applicazione può terminare anormalmente.

Page 163: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Se i metodi di inizializzazione riservano dinamicamente aree esterne al dato e poi vi accedono mediante puntatori è necessario duplicare le aree esterne nel metodo di assegnazione specifico del tipo di dato definito dal programmatore ...

operator=

Req_Max

~Maximum

Value_Ptr

Value

operator=

Temp_Max

~Maximum

Value_Ptr

Value

Page 164: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

... per evitare di creare involontariamente due puntamenti ad una stessa area esterna.

operator=

Req_Max

~Maximum

Value_Ptr

Value

operator=

Temp_Max

~Maximum

Value_Ptr

Page 165: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Dopo il richiamo al metodo di rilascio delle risorse di Temp_Max le aree esterne di Temp_Max sono state rilasciate ...

operator=

Req_Max

~Maximum

Value_Ptr

operator=

Temp_Max

~Maximum

Value_Ptr

Page 166: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

... e se erano condivise con Req_Max, ora Req_Max può trovarsi con un puntatore ad un’area esterna non più valida.

operator=

Req_Max

~Maximum

Value_Ptr

operator=

Temp_Max

~Maximum

Value_Ptr

Page 167: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Il tentativo di rilasciare le aree di Req_Max può causare la fine anomala dell’applicazione.

operator=

Req_Max

~Maximum

Value_Ptr

operator=

Temp_Max

~Maximum

Value_Ptr

Page 168: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

1 #ifndef __MAXIMUM_H

2 #define __MAXIMUM_H

3 class Maximum

4 {// File: Maximum.h

5 public:

6 Maximum (void);

7 Maximum (int theMaximum);

8 Maximum (Maximum &theMaximum_Ref);

9 ~Maximum (void);

10 Maximum& operator=(Maximum &theMaximum_Ref);

... ...

11 };

12 #endif // __MAXIMUM_H

Questo è il metodo che assegna un dato di tipo Maximum ad un altro dato dello stesso tipo.

Page 169: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

Fine

No

Il metodo di assegnazione dei tipi di dati definiti dal programmatore è generalmente composto da tre passi.

Page 170: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Primo passo: Verifica che il dato non si auto-distrugga assegnandosi a se stesso.

Page 171: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Secondo passo: Rilascio delle risorse riservate dinamicamente dai metodi di inizializzazione della destinazione.

Page 172: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Assegnazione

Origine =

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Terzo passo: Creazione di una copia delle risorse riservate dinamicamente dai metodi di inizializzazione dell’origine e loro attribuzione alla destinazione.

Page 173: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Assegnazione

Riepilogo: In questa discussione abbiamo visto che:

1. Quando il programmatore definisce un suo tipo di dato deve spiegare al compilatore cosa significa assegnare un dato del nuovo tipo ad un dato dello stesso tipo.

2. Il metodo operator= spiega al compilatore come assegnare un dato di tipo definito dal programmatore ad un altro dato dello stesso tipo.

4. Il metodo di assegnazione dei tipi di dati definiti dal programmatore è generalmente composto da tre passi: verifica di non auto-distruzione; rilascio (ad uso privato) delle risorse della destinazione; copia (ad uso privato) delle risorse dell’origine.

5. Quando i metodi di inizializzazione NON richiedono dinamicamente risorse esterne, il metodo di assegnazione descritto in questa discussione è facoltativo, ma per maggior chiarezza si consiglia di costruirne comunque una versione anche se vuota.

3. Per ogni tipo di dato definito dal programmatore c’è un metodo operator= specifico per quel tipo di dato.

Page 174: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

Autodistruzione

Page 175: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

1 #include “Maximum.h”

2 void Calcolo (void)

3 {

4 Maximum Req_Max(10); // Qty foreseen requests

5 Maximum Temp_Max; // Temporary area

6 Req_Max = Req_Max;

... ...

7 }

Problema: Cosa succede se per errore assegnamo Req_Max a se stesso?

Page 176: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Primo passo: Verifica che il dato non si auto-distrugga assegnandosi a se stesso.

Cosa succederebbe se il metodo di assegnazione non contenesse il primo passo di verifica?

Page 177: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Secondo passo: Rilascio delle risorse riservate dinamicamente dai metodi di inizializzazione della destinazione.

Senza il primo passo di verifica, il secondo passo rilascia le risorse riservate dinamicamante ...

Page 178: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Terzo passo: Creazione di una copia delle risorse riservate dinamicamente dai metodi di inizializzazione dell’origine e loro attribuzione alla destinazione.

... ed il terzo passo cerca di copiare risorse che sono appena state rilasciate.

Risultato ...

Page 179: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Autodistruzione

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Terzo passo: Creazione di una copia delle risorse riservate dinamicamente dai metodi di inizializzazione dell’origine e loro attribuzione alla destinazione.

Page 180: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Copia (ad uso privato)

Copia (ad uso privato)

Page 181: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Copia (ad uso privato)

Un metodo di copia (ad uso interno) viene richiamato dal metodo di inizializzazione per copia e dal metodo di assegnazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)

6

Page 182: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Copia (ad uso privato)

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Terzo passo: Creazione di una copia delle risorse riservate dinamicamente dai metodi di inizializzazione dell’origine e loro attribuzione alla destinazione.

È il terzo passo del metodo di assegnazione.

Page 183: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio (ad uso privato)

Rilascio (ad uso privato)

Page 184: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio (ad uso privato)

Un metodo di copia (ad uso interno) viene richiamato dal metodo di inizializzazione per copia e dal metodo di assegnazione.

Inizializzazione “minima”

Inizializzazioni “migliori”

Dato_del_programmatore

Inizializzazione per copia

Rilascio risorse impegnate

Assegnazione

Copia (ad uso privato)

Rilascio (ad uso privato)7

Page 185: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Rilascio (ad uso privato)

È il secondo passo del metodo di assegnazione.

Assegnazione

Origine=

Destinazione

Rilascio risorse della destinazione

Copia risorse dell’origine sulla destinazione

No

Fine

Secondo passo: Rilascio delle risorse riservate dinamicamente dai metodi di inizializzazione della destinazione.

Page 186: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Componenti di un dato del programmatore

Riepilogo: In questa discussione abbiamo visto che:

1. Ci sono alcuni componenti di servizio che compaiono frequentemente nei tipi di dati definito dal programmatore.

2. Il programmatore deve definire alcune operazioni sul tipo di dato da lui/lei definito per permettere al compilatore di gestire correttamente: il passaggio di argomenti a funzioni; la restituzione di valori da funzioni; il rilascio delle risorse riservate dinamicamente dai metodi di inizializzazione di dati creati automaticamente che escono dal loro ambito di visibilità.

3. Quando i metodi di inizializzazione richiedono dinamicamente risorse esterne i metodi di servizio descritti in questa discussione sono obbligatori.

4. Quando i metodi di inizializzazione NON richiedono dinamicamente risorse esterne, i metodi di servizio descritti in questa discussione sono facoltativi, ma per maggior chiarezza si consiglia di costruirne comunque una versione anche se vuota.

Page 187: Introduzione al linguaggio C++ Costruzione di tipi di dati del programmatore.

Introduzione al linguaggio C++

Costruzione di tipi di dati del programmatore

Copyright © 1997 by Mario G. Montobbio

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of the author.

Mario G. Montobbio

mailto:[email protected]

Permission to use, copy and distribute this publication for the purposes of research or private study without fee is hereby granted, provided that this copyright notice and this permission notice appear in all copies.


Recommended