是否可以在没有子类化的情况下为类添加一些功能?

时间:2010-10-06 08:52:59

标签: c++

在Ojective-C中有一些名为Categories的东西允许用户从原始的.h或.m文件之外添加方法(objective-c的.cpp版本) 我想知道C ++中是否存在这样的功能。?

我特别想要实现<<用于调试的运算符,也可能是我经常使用的库中的其他类。 (并且不想使用宏,因为它看起来很难看;))

感谢。

3 个答案:

答案 0 :(得分:5)

你总是可以在课堂外重载操作符。

std::ostream& operator<< (std::ostream& f, const YourClass& cls) {
  ...
}

如果需要访问YourClass的私有成员,您仍然需要friend此功能。

(但是不可能像Objective-C那样定义普通的成员函数。)

答案 1 :(得分:4)

是的,可以为运营商添加重载&lt;&lt;课外:

ostream& operator <<(ostream& lhs, const SomeClass& rhs) {
    /* Output something to lhs using rhs object */
    return lhs;
}

唯一的问题是该函数无法访问SomeClass的私有/受保护成员;要做到这一点,你必须在类中声明这个函数为friend。但是,如果您通过公共界面获得所有必需的信息,那么这不是问题。

答案 2 :(得分:3)

是的,Namespace principle几乎与此相似。我们的想法是在与类相同的命名空间中在类外部进行密切相关的类操作。运算符重载为@KennyTM建议是这个原则的后果(我看待它的方式)

另请查看visitor design pattern

意图

  

表示要进行的操作   对对象的元素执行   结构体。访问者允许您定义   新的操作无需改变   它所依赖的元素的类   操作