uninitialized reference member

egabel

Grünschnabel
Moin,

ich bekommme in den folgenden Klassen einen
"../src/io/PrintStream.cc: In constructor `PrintStream::PrintStream(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
Code:
#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
Code:
 #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();
 }
};
 
Zuletzt bearbeitet:
Eine Frage hast du zwar nicht gestellt, aber ich hätte da eine Teilantwort: Initialisierungsliste!

Code:
PrintStream::PrintStream(OutputChannel& chan) 
: channel( chan )
{
}
 
Code:
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:
Code:
PrintStream::PrintStream(OutputChannel* chan){
  channel = *chan;  //(Dereferenzierung durch '*' vorneweg)
};

Der 2.Fehler folgt dadurch aus dem 1.

Gruß Daniel
 
Zurück