Michael Schmitt wrote:

> Since quite a long time I have noticed that the vertical distance between the
> lines in paragraphs of format "lyx code" varies even though you can't see any
> difference on screen. 

The reason for the different amount of space is related to \newline statements
in the lyx document. I have attached a file that includes several places with
lyx code that are printed with varying spaces. I don't have the faintest idea
what I did to get the different results (and I really didn't want to get them;
I always prefer the compact presentation). Any comments are welcome.

Michael

-- 
======================================================================
Michael Schmitt                            phone:     +49 451 500 3725
Institute for Telematics                   secretary: +49 451 500 3721
Medical University of Luebeck              fax:       +49 451 500 3722
Ratzeburger Allee 160              eMail: [EMAIL PROTECTED]
D-23538 Luebeck, Germany           WWW:   http://www.itm.mu-luebeck.de
======================================================================
#LyX 1.1 created this file. For more info see http://www.lyx.org/
\lyxformat 218
\textclass foils
\options dvips,footrule
\language german
\inputencoding latin1
\fontscheme default
\graphics default
\paperfontsize 17
\spacing single 
\papersize a4paper
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation skip
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle foilheadings

\layout Standard


\latex latex 

\backslash 
MyLogo{Institut für Telematik}
\layout Foilhead

Zeiger und Referenzen
\layout Standard

C++-Datentypen:
\layout Itemize

Einfache Datentypen
\layout Itemize

Zusammengesetzte Datentypen
\layout Itemize


\series bold 
Zeiger (engl.: Pointer)
\layout Itemize


\series bold 
Referenzen
\layout Itemize

Klassen
\layout Itemize

Template-Klassen
\layout Standard

Kontext:
\layout Itemize

Variablendeklaration/-definition
\layout Itemize

Zuweisungen, Referenzierung, Dereferenzierung
\layout Itemize

Funktionsaufrufe (formale und aktuelle Parameter)
\layout Foilhead

Zeiger (1)
\layout Itemize
\added_space_bottom bigskip 
Zeiger enthalten die 
\emph on 
Adresse
\emph default 
 eines Objekts/Datentyps; 
\newline 
sie 
\emph on 
verweisen
\emph default 
 auf ein Objekt, sind also nicht das Objekt selbst!
\layout Itemize

Variablendeklaration/-definition
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
int      *ip1, *ip2, i3;
\newline 
Rational *objp;
\newline 
 
\layout Standard

Achtung:
\lang american
 
\family typewriter 
\size small 
\lang german
i3
\family default 
\size default 
 ist 
\emph on 
kein
\emph default 
 Zeiger, sondern ein Integer-Wert!
\end_deeper 
\layout Itemize

Referenzierung (Operator 
\family typewriter 
&
\family default 
)
\begin_deeper 
\layout LyX-Code


\size small 

\newline 
ip1 = &i3;   // Adressoperator
\newline 
ip2 = ip1;
\newline 
 
\end_deeper 
\layout Itemize

Dereferenzierung (Operatoren 
\family typewriter 
*
\family default 
 und 
\family typewriter 
->
\family default 
)
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
int      i = 42, *ip = &i; 
\newline 
Rational obj, *objp = &obj;
\newline 

\newline 
*ip = *ip + 1;   // inkrementiert i
\newline 
cout << *ip << endl;
\newline 
( *objp ).read();
\newline 
objp -> write();
\end_deeper 
\layout ShortFoilhead

Zeiger (2)
\layout Itemize

Funktionsaufrufe:
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
void foo( Rational *obj )
\newline 
{
\newline 
  obj -> read();
\newline 
}
\newline 

\newline 
int main()
\newline 
{
\newline 
  Rational obj, *objp = &obj;
\newline 

\newline 
  foo( &obj );
\newline 
  foo( objp );
\newline 
}
\newline 
 
\layout Standard

Funktionen mit Zeiger-Parametern sind in der Regel nicht nebeneffekt-frei;
 ihr Aufruf entspricht einem 
\emph on 
call-by-reference
\end_deeper 
\layout Itemize

Jede (nicht-statische) Methode einer Klasse definiert implizit einen Zeiger
 namens 
\emph on 
this
\emph default 
 auf das zu behandelnde Objekt
\layout Standard

Achtung: 
\layout Itemize

Zeiger, die momentan auf kein Objekt verweisen, sollten den Wert 
\begin_inset Formula \( 0 \)
\end_inset 

 erhalten!
\layout Itemize

Zeiger werden nicht automatisch initialisiert, sondern haben als Wert eine
 zufällige Adresse im Speicher!
\layout Foilhead

Speicherverwaltung
\layout Itemize

Dynamisches Erzeugen von Variablen und Objekten mit 
\emph on 
new
\emph default 
:
\begin_deeper 
\layout Enumerate
\added_space_top bigskip 
Reservierung von Speicher
\layout Enumerate
\added_space_bottom bigskip 
Aufruf des Konstruktors
\layout Standard

Beispiele:
\layout LyX-Code


\size small 
 
\newline 
int      *i       = new int;
\newline 
int      *iFeld   = new int[ 10 ];
\newline 
Rational *obj     = new Rational( 2, 4 );
\newline 
Rational *objFeld = new Rational[ 10 ];
\newline 

\size default 
 
\end_deeper 
\layout Itemize

Freigeben von Variablen und Objekten mit 
\emph on 
delete
\emph default 
:
\begin_deeper 
\layout Enumerate
\added_space_top bigskip 
Aufruf des Destruktors
\layout Enumerate
\added_space_bottom bigskip 
Freigeben von alloziiertem Speicher
\layout Standard

Beispiele:
\layout LyX-Code


\size small 
 
\newline 
delete i;
\newline 
delete [] iFeld;
\newline 
delete obj;
\newline 
delete [] objFeld;
\newline 
 
\layout Standard

Der 
\emph on 
delete
\emph default 
-Operator darf nur auf dynamisch kreierte Objekte angewendet werden!
\end_deeper 
\layout Foilhead

Referenzen (1)
\layout Itemize

Eine Referenz dient als alternativer Name (
\emph on 
Alias
\emph default 
) für ein Objekt
\layout Itemize

Referenzen werden normalerweise aus Effizienzgründen verwendet, wenn komplexe
 Klassenobjekte an eine Funktion übergeben werden sollen
\layout Itemize

Referenzen entsprechen
\begin_deeper 
\layout Itemize


\emph on 
technisch
\emph default 
 Zeigern
\layout Itemize
\added_space_bottom bigskip 

\emph on 
syntaktisch
\emph default 
 
\begin_inset Quotes eld
\end_inset 

normalen
\begin_inset Quotes erd
\end_inset 

 Datentypen
\end_deeper 
\layout Itemize

Variablendeklaration/-definition
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
Rational obj1;
\newline 
Rational &obj2 = obj1;   // Referenz auf 'obj1'
\newline 
 
\layout Standard

Referenzen müssen bei ihrer Definition initialisiert werden!
\layout Standard

Referenzen können nicht verändert werden; sie verweisen nach der Initialisierung
 immer auf das gleiche Objekt!
\end_deeper 
\layout Itemize

Objektzugriff (Operator 
\family typewriter 
.
\family default 
)
\begin_deeper 
\layout LyX-Code

 
\size small 

\newline 
Rational obj1, &obj2 = obj1, *objp3 = 0;
\newline 

\newline 
objp3 = new Rational();
\newline 
obj1.read();
\newline 
obj2.write();
\newline 
*objp3 = obj2;
\layout LyX-Code

\end_deeper 
\layout Foilhead

Referenzen (2)
\layout Itemize

Funktionsaufrufe:
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
void foo( const Rational &obj )
\newline 
{
\newline 
  obj.write();   // 'read' is not allowed
\newline 
}
\newline 

\newline 
int main()
\newline 
{
\newline 
  Rational obj1( 5, 3 ), &obj2 = obj1, 
\newline 
           *obj3 = new Rational( 2, 4 );
\newline 

\newline 
  foo( obj1 );
\newline 
  foo( obj2 );
\newline 
  foo( *obj3 );
\newline 
}
\newline 
 
\layout Standard

Referenzen als Parameter suggerieren aufgrund ihrer Syntax im Methoden-Rumpf
 einen 
\emph on 
call-by-value
\emph default 
, realisieren aber wie Zeiger ein 
\emph on 
call-by-reference
\emph default 
 
\layout Standard


\begin_inset Formula \( \rightarrow  \)
\end_inset 

 Referenz-Objekte stets als konstant definieren!
\end_deeper 
\layout Foilhead

Knifflige Fälle
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/mixed_ptrs_refs.cc}

\end_inset 


\layout ShortFoilhead

Tödliche Sünden
\layout Itemize

Rückgabe eines temporären Objekts als Referenz oder Zeiger
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
Rational &foo( ...
 )
\newline 
{
\newline 
  Rational result( 3, 4 );
\newline 
  return result;
\newline 
}
\newline 

\newline 
Rational *foo( ...
 )
\newline 
{
\newline 
  Rational result( 3, 4 );
\newline 
  return &result;
\newline 
}
\newline 
 
\end_deeper 
\layout Itemize

Rückgabe eines dynamisch angelegten Objekts
\begin_deeper 
\layout LyX-Code


\size small 
 
\newline 
Rational foo( ...
 )
\newline 
{
\newline 
  Rational *result = new Rational( 3, 4 );
\newline 
  return *result;
\newline 
}
\newline 

\newline 
Rational &foo( ...
 )
\newline 
{
\newline 
  Rational *result = new Rational( 3, 4 );
\newline 
  return *result;
\newline 
}
\end_deeper 
\layout Foilhead

Klasse 'Stack' - Erster Ansatz (1)
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/RationalStack.h}

\end_inset 


\layout ShortFoilhead

Klasse 'Stack' - Erster Ansatz (2)
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/RationalStack.cc}

\end_inset 


\layout Foilhead

Klassen mit dynamischen Datenstrukturen
\layout Itemize

Beim Kopieren von Objekten werden standardmässig alle Komponenten flach
 1:1 kopiert
\newline 

\begin_inset Formula \( \rightarrow  \)
\end_inset 

 Das Duplizieren von Objekten mit dynamisch angelegten Datenstrukturen ist
 problematisch
\layout Itemize
\added_space_bottom 13cm 
Beispiel: Stack
\layout Itemize

Definition von Copy-Konstruktor und Zuweisungsoperator (=) ist absolut unerlässl
ich!!!
\layout Foilhead

Kopieren und Löschen von Objekten
\layout LyX-Code


\size tiny 

\begin_inset Include \verbatiminput{Programme/copy_destroy.cc}

\end_inset 


\layout Foilhead

Klasse 'Stack' - Zweiter Ansatz (1)
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/RationalStack-2.h}

\end_inset 


\layout Foilhead

Klasse 'Stack' - Zweiter Ansatz (2)
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/RationalStack-2.cc}

\end_inset 


\layout Foilhead

Templates
\layout Itemize

Templates stellen parametrisierte Klassen dar
\layout Itemize

Templates sind oftmals sog.
 
\emph on 
Container
\emph default 
-Klassen, in denen Objekte beliebiger anderer Klassen abgelegt werden können
\layout Itemize

Standard Template Library (STL) 
\begin_deeper 
\layout Itemize

Container-Klassen
\begin_deeper 
\layout Itemize

basic_string
\layout Itemize

vector
\layout Itemize

map
\layout Itemize

set
\layout Itemize

...
\layout Standard

Alle Container-Klassen bieten eine Reihe von gemeinsamen Methoden, z.B.
 um die Anzahl der Elemente zu ermitteln
\end_deeper 
\layout Itemize

Iteratoren
\begin_deeper 
\layout Itemize

Zugriff auf einzelne Elemente oder Bereiche eines Containers
\layout Itemize

Ermöglichen das systematische Durchsuchen von Container-Klassen
\end_deeper 
\layout Itemize

Algorithmen 
\begin_deeper 
\layout Itemize

Manipulation von Containern
\end_deeper 
\end_deeper 
\layout Foilhead

STL - Map & Iteratoren
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/mapbeispiel.cc}

\end_inset 


\layout Foilhead

Generische Stackimplementierung
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/GenericStack.h}

\end_inset 


\layout Foilhead

Instanziierung von Templates (1)
\layout Standard
\added_space_bottom bigskip 
Aus einer Template-Klasse und einem (oder mehreren) Template-Argument(en)
 generiert der Compiler eine Klassendefinition
\layout Standard

Implizit:
\layout Itemize

Die Template-Klasse wird vollständig in der Headerdatei definiert
\layout Itemize

Für jede cc-Datei, die ein Template verwendet, wird entsprechender Objektcode
 erzeugt
\layout Itemize

Der Linker verwirft später in verschiedenen Objektdateien doppelt definierte
 Klassenmethoden
\layout Itemize

Beispiel:
\begin_deeper 
\layout LyX-Code


\size tiny 
 
\newline 
/* Main.cc */
\newline 

\newline 
#include <vector>
\newline 
#include 
\begin_inset Quotes eld
\end_inset 

GenericStack.h
\begin_inset Quotes erd
\end_inset 


\newline 

\newline 
using std::vector;
\newline 

\newline 
GenericStack< int >        stack1;
\newline 
GenericStack< Rational >   stack2;
\newline 
vector< vector< int > >    matrix;
\newline 

\size default 
 
\end_deeper 
\layout Foilhead

Instanziierung von Templates (2)
\layout Standard

Explizit:
\layout Itemize

Die Definition der Template-Klasse wird wie üblich in Schnittstellenbeschreibung
 und Implementation aufgeteilt
\layout Itemize

Benötigte Klassendefinitionen werden mit einer 
\emph on 
template
\emph default 
-Anweisung explizit angegeben
\begin_deeper 
\layout Standard

Beispiel:
\layout LyX-Code


\size tiny 
  
\newline 
/* Stack.cc */
\newline 

\newline 
template <class C>
\newline 
Stack::Stack()
\newline 
{
\newline 
  ...
\newline 
}
\newline 

\newline 
template class Stack<int>;
\newline 
template class Stack<Rational>;
\newline 

\size default 

\newline 

\end_deeper 
\layout Foilhead

Ein- und Ausgabe mit 
\emph on 
iostreams
\layout Standard
\added_space_top 0.3cm \added_space_bottom 0.3cm \align center 

\begin_inset Figure size 416 313
file streamhierarchie.eps
width 3 70
angle 270
flags 9

\end_inset 


\layout Itemize


\emph on 
cin
\emph default 
 ist ein (globales) Objekt der Klasse 
\emph on 
istream
\layout Itemize


\emph on 
cout
\emph default 
 ist ein (globales) Objekt der Klasse 
\emph on 
ostream
\layout Foilhead


\emph on 
iostreams
\emph default 
 - Beispiel (1)
\layout Standard

Rational.h
\layout Standard
\added_space_bottom bigskip 

\size tiny 

\begin_inset Include \verbatiminput{Programme/Number/folien_rational_h.txt}

\end_inset 


\layout Standard

Rational.cc
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/Number/folien_rational_cc.txt}

\end_inset 


\layout Foilhead


\emph on 
iostreams
\emph default 
 - Beispiel (2)
\layout Standard

Main.cc
\layout Standard


\size tiny 

\begin_inset Include \verbatiminput{Programme/Number/Main-4.cc}

\end_inset 


\layout Standard
\added_space_top bigskip 
Das Testen auf Ende eines Eingabestroms (z.B.
 Dateiende) kann mit
\family typewriter 
\SpecialChar ~
eof()
\family default 
\SpecialChar ~
erfolgen
\layout Standard

Alternative Formulierung der do-while-Schleife aus Main.cc: 
\layout LyX-Code


\size footnotesize 
while( !inputstream.eof() )
\layout LyX-Code


\size footnotesize 
{
\layout LyX-Code


\size footnotesize 
  inputstream >> rat; 
\layout LyX-Code


\size footnotesize 
  rat = rat * Rational( -1, 1 ); 
\layout LyX-Code


\size footnotesize 
  outputstream << rat << endl; 
\layout LyX-Code


\size footnotesize 
} 
\layout Foilhead

Umwandeln von Zahlen in Strings
\layout Standard

Problemstellung: 
\layout Itemize
\align left 
Aus den Zahlen i\SpecialChar ~
=\SpecialChar ~
42 und f\SpecialChar ~
= 3.14 soll der String s\SpecialChar ~
=\SpecialChar ~

\begin_inset Quotes eld
\end_inset 


\family typewriter 
i\SpecialChar ~
=\SpecialChar ~
42\SpecialChar ~
/\SpecialChar ~
f\SpecialChar ~
=\SpecialChar ~
3.14
\family default 

\begin_inset Quotes erd
\end_inset 

 erzeugt werden
\layout Standard

Lösung mit String-Streams:
\layout LyX-Code


\size footnotesize 
#include <string>
\layout LyX-Code


\size footnotesize 
#include <iostream>
\layout LyX-Code


\size footnotesize 
#include <sstream>
\layout LyX-Code


\size footnotesize 
...
\layout LyX-Code


\size footnotesize 
using namespace std;
\layout LyX-Code


\size footnotesize 
...
\layout LyX-Code


\size footnotesize 
int main( void )
\layout LyX-Code


\size footnotesize 
{
\layout LyX-Code


\size footnotesize 
  int   i = 42;     string        s;
\layout LyX-Code


\size footnotesize 
  float f = 3.14;   ostringstream ss;
\layout LyX-Code


\size footnotesize 
 \SpecialChar ~

\layout LyX-Code


\size footnotesize 
  ss << "i = " << i << " / f = " << f;
\layout LyX-Code


\size footnotesize 
  s = ss.str();\SpecialChar ~
 // convert string stream to string
\layout LyX-Code


\size footnotesize 
  cout << s << endl;
\layout LyX-Code


\size footnotesize 
}
\layout Standard
\align left 

\series bold 
Achtung
\series default 
: Die Implementierung der String-Streams ist in den Bibliotheken vieler
 C++-Compiler (z.B.
 gcc 2.95) fehlerhaft! 
\layout Standard

Abhilfe: Verwendung der C-Funktion 
\family typewriter 
sprintf
\family default 
 (
\begin_inset Formula \( \Rightarrow  \)
\end_inset 


\family typewriter 
 man sprintf
\family default 
)
\layout LyX-Code


\size footnotesize 
#include <stdio.h>
\layout LyX-Code


\size footnotesize 
...
\layout LyX-Code


\size footnotesize 
string s;
\layout LyX-Code


\size footnotesize 
char   c[ 100 ];
\layout LyX-Code


\size footnotesize 
...
\layout LyX-Code


\size footnotesize 
sprintf( c, "i = %i / f = %f", i, f );
\layout LyX-Code


\size footnotesize 
s = c;
\layout LyX-Code

\the_end

Reply via email to