2016-06-17 5 views
3

私が「保護」で、次のコード行が含まれている「クライアント」という名前のクラス 、から継承された「加入者」という名前のクラスを、持っている:"this"はconstですが、std:ostream&memberで正しく使用するには?

std::ostream& messagesSink; 

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

(messagesSinkはコンストラクタで初期化されます加入者の)

と、以下の機能-メンバーは「加入者」であり:

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

問題はこのように書きます:彼の現在の状態では、コードはコンパイルエラーがなく、私ならば

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

私の質問は以下のとおりです:

1)diffrenceは前と後とするものです以下のコードは、コンパイル・エラーが表示されているとおり、機能getMessagesSink()のメンバーmessagesSinkの使用を置き換えますか?

2) "this"をconstとして保持する関数で、std :: ostreamへの参照を正しく使用する方法?

答えて

1

にはconstと表示されていません。 receiveMessageにはconstとマークされているため、非constメンバー関数を呼び出すことはできません。

+0

私はgetMessagesSinkの戻り値を "const std :: ostream&"に変更しようとしましたが、 "const char *"からint、long int、long long intなどの無効な変換の複雑なエラーに繋がります。私は理解していません。なぜ、コンパイラは "int"型の変数を期待していますか?関数を介してostream型のオブジェクトを渡す方法はありますか? –

+0

ああ、答えに感謝します! –

+0

これは問題をうまく説明していますが、解決策を提案していません。 –

0

同じオブジェクトのconstメンバー関数内で非constメンバー関数を使用することはできません。コンパイラに関しては、getMessagesSink()を呼び出すときにオブジェクトを変更する可能性があります。

私はgetMessagesSink()はconstでなければならないと思っています。あなたはそれを変更することができず、あなたの関数をconstのようにしたい場合は、receiveMessage()の中でこれを行うことができます。

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

それ以外の場合は、関数を非constにするか、保護されたmessagesSinkオブジェクトを直接使用する必要があります。もちろん、getMessageSink()の実装が変更された場合、std :: ostreamへの参照を返す前に、コードが破損したり、少なくとも意図したとおりに動作しなくなる可能性があります。

+0

Meh。 'const_cast'は奇妙に見え、実際には必要ありません。それは、クラスメンバに関する「変更可能な」ものです。 –

関連する問題