2016-06-17 17 views
3

Ich habe eine Klasse mit dem Namen „Teilnehmer“, die von einer Klasse geerbt wird namens „Client“, die die folgenden Codezeilen enthalten, in „geschützten“:wie verwendet man richtig in std: ostream & member, während "dies" ist ein const?

std::ostream& messagesSink; 

std::ostream& getMessagesSink() { 
    return messagesSink; 
} 

(messagesSink im Konstruktor initialisiert von Abonnenten)

und es gibt die folgende Funktion-Mitglied in „Teilnehmer“:

virtual void recieveMessage(const std::string& message , 
     const Topic& topic, 
     const Client& client) const { 
    messagesSink << "Topic: "<< topic 
      << ". Sender: #" << client.getId() << ". Reciver: #" 
      << getId() << ".Message: " << message; 
} 

das Problem so geht: in seinem aktuellen Zustand, der Code keine Kompilierungsfehlern hat, aber wenn ich ersetzen Sie die Verwendung des Elements messagesSink in der Funktion getMessagesSink(), wie der folgende Code, Kompilierungsfehlern erscheint:

virtual void recieveMessage(const std::string& message , 
     const Topic& topic, 
     const Client& client) const { 
    getMessagesSink() << "Topic: "<< topic 
      << ". Sender: #" << client.getId() << ". Reciver: #" 
      << getId() << ".Message: " << message; 
} 

meine Fragen sind:

1), was die diffrence zwischen vor und nach?

2) Wie man den Verweis auf std :: ostream richtig verwendet, während in einer Funktion, die "das" als const hält?

Antwort

1

Das Problem ist, dass getMessagesSink nicht const markiert ist. receiveMessage ist mit const gekennzeichnet, so dass nicht-konstante Mitgliedsfunktionen aufgerufen werden können.

+0

Ich habe versucht, den Rückgabewert von getMessagesSink zu "const std :: ostream &" zu ändern, aber es führt nur zu Komplikationsfehlern der ungültigen Konvertierung von "const char *" zu int, long int, long long int und so her, und das verstehe ich auch nicht .. warum erwartet der Compiler eine Variable vom Typ "int"? Gibt es eine Möglichkeit, das Ostream-Objekt durch eine Funktion zu übergeben? –

+0

oh, und danke für die Antwort! –

+0

Das erklärt das Problem gut, aber vermisst eine Lösung vorzuschlagen. –

0

Sie können nicht-konstante Elementfunktionen nicht innerhalb von Konst-Member-Funktionen desselben Objekts verwenden. Soweit es den Compiler betrifft, könnten Sie das Objekt ändern, wenn Sie getMessagesSink() aufrufen.

Ich denke, getMessagesSink() sollte const sein, wenn Sie das nicht ändern können und Sie wollen immer noch Ihre Funktion const Sie können so etwas in receiveMessage() tun.

Subscriber* self = const_cast<Subscriber*>(this); 
std::ostream& messageSink = self->getMessagesSink(); 

Andernfalls müssen Sie entweder Ihre Funktion nicht-const, oder einfach das geschützte messagesSink-Objekt direkt verwenden. Natürlich, wenn sich die Implementierung von getMessageSink() ändert, indem etwas an den std :: ostream gemacht wird, bevor ein Verweis darauf zurückgegeben wird, würde Ihr Code wahrscheinlich brechen oder zumindest nicht mehr wie beabsichtigt funktionieren.

+0

Meh. 'const_cast' sieht seltsam aus und wird nicht wirklich benötigt. Das ist "veränderbar" für die Klassenmitglieder. –