# uninitialized reference member



## egabel (14. April 2005)

Moin,

ich bekommme in den folgenden Klassen einen
"../src/io/PrintStream.cc: In constructor `PrintStream:rintStream(OutputChannel*)':
../src/io/PrintStream.cc:3: error: uninitialized reference member `PrintStream::channel'
../src/io/PrintStream.cc:4: error: no match for 'operator=' in 'this->PrintStream::channel = &chan'"
error beim make`n. Der andere Thread hier im Board konnte mir da nicht weiterhelfen und google zeigt uns auch die kalte schulter. Vielleicht hat hier ja jemand eine Idee.

*PrintStream.h*

```
#ifndef PrintStream_h 
#define PrintStream_h 
 
#include "io/OutputChannel.h" 
 
/* 
 * PrintStream:
Diese Klasse ist aehnlich der Java-PrintStream Klasse 
 *

Sie konvertiert u.A. numerische Werte in sichtbare Zeichen 
 *

und gibt Sie auf dem im Konstruktor spezifizierten 
 *

Ausgabekanal aus. 
 *

Daraus ergeben sich 2 Teilaufgaben: 
 * 
 *

1. Die Feststellung der Ziffern einer Zahl 
 *

2. Die Umwandlung der Ziffern in darstellbare Zeichen 
 * 
 *

Man beachte, dass diese Klasse unabhaengig 
 *

von dem tatsaechlich verwendeten Ausgabekanal arbeitet. 
 * 
 *

Anmerkung: Diese Klasse werden wir spaeter noch in 
 *

C++ konforme Ausgabe umwandeln. 
 */ 
 
class PrintStream { 
private:  
enum Base {  

Binary = 2,  

Decimal = 10,  

Hex = 16  
}; 
 
public:  
PrintStream(OutputChannel* chan);  
PrintStream(OutputChannel& chan); 
 
    // Ausgabe eines mit einem NULL-Byte terminierten Strings  
void print(const char* str);  
void print(char ch); 
 
    // Ausgabe eines Strings mit anschliessendem Zeichenvorschub  
void println(const char* str); 
  
// Zeilenvorschub  
void println(); 
  
// numerische Werte werden zur Basis 'base' Ausgegeben  
// implementiere die Basen 2, 10 und 16  
void print(int x, int base = Decimal);  
void print(unsigned x, int base = Decimal); 
  
// Zeigertypen werden immer zur Basis 16 ausgegeben!  
void print(void* p); 
 
private:  
OutputChannel& channel; 
  
static char lookup[]; 
}; 
 
#endif
```

*PrintStream.cc*

```
#include "io/PrintStream.h"

PrintStream::PrintStream(OutputChannel* chan){
  channel = &chan;
};

PrintStream::PrintStream(OutputChannel& chan){
  channel=chan;
};

void PrintStream::print(const char* str){
  int i=0;
  while(str[i]){
    ++i;
  }
  channel.show(str,i);
};

void PrintStream::print(char ch){
  channel.show(ch);
};

void PrintStream::println(const char* str){
  int i=0;
 while(str[i]){
   ++i;
 }
 channel.show(str,i);
 int row,column;
 channel.getCursor(row,column);
 if (row < 25){
   ++row;
   column=0;
 }else{
   channel.scroll();
 }
};
```


----------



## Kachelator (14. April 2005)

Eine Frage hast du zwar nicht gestellt, aber ich hätte da eine Teilantwort: Initialisierungsliste!


```
PrintStream::PrintStream(OutputChannel& chan) 
: channel( chan )
{
}
```


----------



## Daniel Toplak (15. April 2005)

```
PrintStream::PrintStream(OutputChannel* chan){
  channel = &chan;
};
```

Also das ist Falsch. (Peter hättest du auch sehen sollen! 

Du definierst channel als OutputChannel&  (als Referenz) dann definierst du einen Konstruktor mit einem Zeiger auf OutputChannel.
Dann versuchst du dem Member channel die Adresse des Zeigers auf OutputChannel zuzuweisen im Klartext wäre das:
OutputChannel& = OutputChannel** (das geht nicht ).
Wenn dann must du eine Kopie anlegen (wie in deinem anderen Konstruktor.
Dies machst du über Dereferenzierung des Zeigers also so:

```
PrintStream::PrintStream(OutputChannel* chan){
  channel = *chan;  //(Dereferenzierung durch '*' vorneweg)
};
```

Der 2.Fehler folgt dadurch aus dem 1.

Gruß Daniel


----------



## Kachelator (15. April 2005)

> (Peter hättest du auch sehen sollen!


 Ich habe nie mehr als eine Teilantwort geboten. 

Trotzdem vielen Dank für die Anmerkung!


----------



## Daniel Toplak (15. April 2005)

> Ich habe nie mehr als eine Teilantwort geboten.


Jaja so kann man sich auch rausreden 
(Bitte nich ernst meinen!)

Daniel


----------



## Kachelator (15. April 2005)

Okay, alles klar! 

Enterbt bist du trotzdem!


----------

