プロジェクトにyaml-cppを使用しています。<<
一部のクラスのand演算子をオーバーロードしたいの>>
ですが、これを「適切に」行う方法に取り組んでいます。Note
たとえば、クラスを取ります。それはかなり退屈です:
class Note {
public:
// constructors
Note( void );
~Note( void );
// public accessor methods
void number( const unsigned long& number ) { _number = number; }
unsigned long number( void ) const { return _number; }
void author( const unsigned long& author ) { _author = author; }
unsigned long author( void ) const { return _author; }
void subject( const std::string& subject ) { _subject = subject; }
std::string subject( void ) const { return _subject; }
void body( const std::string& body ) { _body = body; }
std::string body( void ) const { return _body; }
private:
unsigned long _number;
unsigned long _author;
std::string _subject;
std::string _body;
};
<<
オペレーターは簡単なソースです。で.h
:
YAML::Emitter& operator << ( YAML::Emitter& out, const Note& v );
そしてで.cpp
:
YAML::Emitter& operator << ( YAML::Emitter& out, const Note& v ) {
out << v.number() << v.author() << v.subject() << v.body();
return out;
}
汗かいていない。次に、>>
演算子を宣言します。で.h
:
void operator >> ( const YAML::Node& node, Note& note );
しかし、.cpp
私は得る:
void operator >> ( const YAML::Node& node, Note& note ) {
node[0] >> ?
node[1] >> ?
node[2] >> ?
node[3] >> ?
return;
}
もし私がそのようなことを書いたらnode[0] >> v._number;
、CV 修飾子を変更してすべてのNote
フィールドを作成する必要がありますpublic
(これは、データの隠蔽について (教授、本、および経験によって) 教えられたすべてのものを打ち負かします)。
node[0] >> temp0; v.number( temp0 );
いたるところで行うのは、退屈で、エラーが発生しやすく、見苦しいだけでなく、無駄が多いように感じます (余分なコピーの場合)。
それから私は賢明になりました: 私はこれらの 2 つの演算子をNote
クラス自体に移動し、それらを s として宣言しようとしましfriend
たが、コンパイラ (GCC 4.4) はそれを好きではありませんでした:
src/note.h:44: エラー: 'YAML::Emitter& Note::operator<<(YAML::Emitter&, const Note&)' は 1 つの引数を取る必要があります
src/note.h:45: エラー: 'void 注: :operator>>(const YAML::Node&, Note&)' は引数を 1 つだけ取る必要があります
質問:>>
クラスの演算子を「適切に」オーバーロードするにはどうすればよいですか
- 情報隠蔽の原則に違反することなく?
- 過度のコピーなしで?