在尝试了解poco网络库here时,我遇到了以下代码段:
class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest &)
{
return new MyRequestHandler;
}
};
我无法理解方法的返回类型(HTTPRequestHandler*
)和方法的参数(const HTTPServerRequest &
)。
为什么返回类型为HTTPRequestHandler
指针? new MyRequestHandler
是否将地址返回给可以通过其基类型引用的对象?
另外,我理解const
用于使引用不可变,因此该方法不会改变引用的对象,但没有为引用类型提供名称,并且没有在createRequestHandler
中使用它方法。有人可以告诉我这里会发生什么吗?
由于
答案 0 :(得分:3)
返回类型
如果你看一下“学习Poco”代码网站,
class MyRequestHandler : public HTTPRequestHandler
{
// ... removed code
};
MyRequestHandler派生自HTTPRequestHandler。因此,由于继承,MyRequestHandler是HTTPRequestHandler。因此返回指向MyRequestHandler的指针是有效的,因为它也是指向HTTPRequestHandler的指针。
功能参数
该代码段令人困惑,因为它将参数指定为类型但没有变量名称。它实际上与:
相同class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & notUsed)
{
return new MyRequestHandler;
}
};
'notUsed'变量是......未使用。所以你问,为什么会有争论呢?因为它覆盖了基类HTTPRequestHandlerFactory中声明的函数。此函数将具有参数const HTTPServerRequest &
,因此它也必须出现在派生类的重写函数中(即使它未被使用)。如果在createRequestHandler()
函数中使用'notUsed',则const
关键字可确保无法在createRequestHandler()
内更改。
答案 1 :(得分:1)
有两种方法可以返回访问对象的方法,而无需在C ++中复制它:返回指向它的指针或返回对它的引用。由于各种原因,指针往往是首选方法(例如,引用不可重新分配)。
请注意,如果它返回HTTPRequestHandler
而不是指向它的指针,则表示该对象将被复制。
不必提供参数名称,因为它未被使用。必须提供类型,以便完成功能签名。在向前声明函数时,您同样不需要提供名称,因为编译器只关心它们的类型和顺序。