0

在尝试在这里了解 poco 网络库时,我遇到了以下代码段:

class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
  virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest &)
  {
    return new MyRequestHandler;
  }
};

我无法理解方法 () 的返回类型和方法 ( HTTPRequestHandler*) 的参数const HTTPServerRequest &

为什么返回类型是HTTPRequestHandler指针?是否new MyRequestHandler将地址返回到可以由其基类型引用的对象?

另外,我理解const用于使引用不可变,以便该方法不会改变被引用的对象,但是没有为引用类型提供名称并且它没有在createRequestHandler方法中使用。有人可以告诉我这里可能发生了什么吗?

谢谢

4

2 回答 2

3

返回类型

如果您查看“Learning 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 &,因此它也必须出现在派生类的覆盖函数中(即使它没有被使用)。如果要在函数中使用“notUsed” createRequestHandler(),则const关键字确保它不能在内部更改createRequestHandler()

于 2012-07-12T04:35:52.563 回答
1

有两种方法可以返回访问对象而无需在 C++ 中复制对象的方法:返回指向它的指针或返回对它的引用。由于各种原因,指针往往是首选方法(例如,引用不可重新分配)。请注意,如果它返回HTTPRequestHandler而不是指向它的指针,则意味着将复制该对象。

不必提供参数名称,因为它没有被使用。必须提供类型,以便函数签名完整。同样,您在前向声明函数时也不必提供名称,因为编译器只关心类型和它们进入的顺序。

于 2012-07-12T04:13:31.393 回答