2010-10-06 47 views
2

在Ojective-C中有一些称为Categories的类别,允许用户从原始.h或.m文件(objective-c的.cpp版本)之外添加方法。我想知道在C++中是否存在这样的功能。是否可以在没有子类的情况下为某个类添加一些功能?

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

谢谢。

回答

5

你总是可以重载班级以外的操作员。

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

你仍然需要friend这个功能,如果它需要访问YourClass的私有成员。

(但它不是可以定义像什么Objective-C的不正常的成员函数)。

+1

只需添加Extraction(>>)和Insertion(<<)运算符不能通过成员函数重载。必须通过Friend功能超载。 – 2010-10-06 09:04:52

+0

+1澄清:“不可能定义正常的成员函数” – nacho4d 2010-10-06 09:06:14

+0

@Als:只有因为我们的自定义类在右边,才能通过成员函数重载'''和'<<'运算符侧。 – kennytm 2010-10-06 09:11:52

4

是的,这是可以添加的过载操作之类的< <外:

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

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

3

是的,Namespace principle几乎与此类似。这个想法是在与类相同的命名空间的类之外有紧密相关的类操作。操作符重载为@KennyTM建议是这一原则尘(我看它的方式)

也看一下visitor design pattern

意向

代表行动是 执行上对象 结构的元素。访问者可让您定义 新操作,而无需更改 运行的元素的类别 。

+0

+1因为链接...我读过它们,我现在不打算使用它,但很高兴知道 – nacho4d 2010-10-06 09:43:49

+0

@ nacho4d:太棒了。只是想让你知道,如果你正确使用@ KennyTM的解决方案,你会不知不觉地使用命名空间原则。玩的开心! – Chubsdad 2010-10-07 06:17:19

相关问题