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

リターンタイプ

「LearningPoco」コードのWebサイトを見ると、

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 ++でオブジェクトのコピーを作成せずにオブジェクトにアクセスする方法を返すには、2つの方法があります。オブジェクトへのポインタを返すか、オブジェクトへの参照を返します。ポインタは、さまざまな理由で推奨される方法になる傾向があります(たとえば、参照は再割り当てできません)。それが戻ってきて、それHTTPRequestHandlerへのポインタではない場合、それはオブジェクトがコピーされることを意味することに注意してください。

引数名は使用されないため、指定する必要はありません。関数のシグネチャが完成するように、タイプを指定する必要があります。同様に、関数を前方宣言するときに名前を指定する必要はありません。コンパイラは型とそれらが入ってくる順序のみを考慮しているからです。

于 2012-07-12T04:13:31.393 に答える