【发布时间】:2011-04-06 10:48:13
【问题描述】:
我想在 c++ 中像 jquery-way 一样进行链式调用。样本:
$('#obj').getParent().remove();
所以,据我了解,类的每个方法都应该将指针返回给自己(this)。
在我调用基派生方法之前一切正常。代码:
class Base
{
Base *base1() { return this; }
Base *base2() { return this; }
};
class Derived : Base
{
Derived *derived1() { return this; }
Derived *derived2() { return this; }
};
Derived *obj = new Derived();
obj->derived1()->derived2(); // Everything is okay
obj->derived1()->base1()->derived2(); // Fail at second step
当然,base1 返回 Base 的指针。有什么方法可以进行自动投射?
UPD:也许这可以通过宏实现?喜欢
#define CORRECT_RETURN (this)
和
Base::base1() {
return CORRECT_RETURN;
}
以这种方式。还是编译器不会看这样的构造?
【问题讨论】:
-
这根本不是“jquery-way”的功能。当然,没有办法做你想做的事。您尝试在 Base 上调用的函数(在调用 base1() 之后)当然必须在 Base 的接口中。
-
我不确定您要达到的目标。如果它是将调用链接在一起,您可以在不使用继承的情况下添加无限。如果目标是产生正确类型的返回,则需要研究协方差或重载类型转换。
-
签名“base()”意味着你得到了一个指向基数的指针,这没有多大意义。应该更改方法名称以匹配它们所服务的任何功能,而不是简单地成为“this”指针的获取器。如果您想要“this”指针,只需跳过 getter。您仍然可以从任何函数返回“this”,并使用协方差(如 Tyler 建议的那样)。
-
我怀疑
base1和base2真的是方法的名称。它们很可能是匿名名称,仅表示它是在基类接口中声明的方法。因此,在派生类对象上调用函数时,返回指向派生类对象的指针应该没有语义问题。