【发布时间】:2010-06-07 03:46:32
【问题描述】:
我在一个项目中使用yaml-cpp。我想为某些类重载 << 和 >> 运算符,但我在努力解决如何“正确”执行此操作时遇到问题。以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 ); 不仅乏味、容易出错和丑陋,而且相当浪费(额外的副本会怎样)。
然后我聪明了:我试图将这两个运算符移动到 Note 类本身,并将它们声明为 friends,但编译器 (GCC 4.4) 不喜欢这样:
src/note.h:44: error: ‘YAML::Emitter& Note::operator src/note.h:45: error: ‘void Note::operator>>(const YAML::Node&, Note&)’ 必须只有一个参数
问题:如何“正确”重载类的 >> 运算符
- 不违反信息隐藏原则?
- 没有过度复制?
【问题讨论】:
-
将
operator<<作为成员函数移动时的错误告诉您,当您将运算符重写为成员函数时,左侧操作数必须是该类类型,而右侧是运算符的 only 参数。您不能覆盖将YAML::Emitter作为第一个参数作为YAML::Emitter类之外的类成员的运算符 -
考虑根据
const参考返回字符串。
标签: c++ operator-overloading information-hiding yaml-cpp