2017-11-01 13 views
0

基本的な質問に答えるのが好きでない人のための公正な警告:私は長い間C++コードを見たことがあまりありません。私が求めているものの中には、基本的な構文のものがあります。私は疑問を定式化する言語について十分に分かっていません。私はgoogleに何がわからない。うまくいけば、あなたの何人かが私の質問を結びついて何かに編集するのを助けてくれるはずです。Dlib:ignoreフラグを1に設定してmmod_rectを初期化するにはどうすればよいですか?

これは問題です。私は現在、dlibに関わるプロジェクトに取り組んでいます。 dlibには、hereと定義されたmmod_rectという構造体があります。

struct mmod_rect 
{ 
    mmod_rect() = default; 
    mmod_rect(const rectangle& r) : rect(r) {} 
    mmod_rect(const rectangle& r, double score) : rect(r),detection_confidence(score) {} 
    mmod_rect(const rectangle& r, double score, const std::string& label) : rect(r),detection_confidence(score), label(label) {} 

    rectangle rect; 
    double detection_confidence = 0; 
    bool ignore = false; 
    std::string label; 

    operator rectangle() const { return rect; } 
    bool operator == (const mmod_rect& rhs) const 
    { 
     return rect == rhs.rect 
       && detection_confidence == rhs.detection_confidence 
       && ignore == rhs.ignore 
       && label == rhs.label; 
    } 
}; 

inline mmod_rect ignored_mmod_rect(const rectangle& r) 
{ 
    mmod_rect temp(r); 
    temp.ignore = true; 
    return temp; 
} 

関連性がある場合、長方形のドキュメントはhereです。基本的に、rectangleは左、上、右、下の整数を渡すことで初期化されるクラスです。次のように

Iが最初で提供された作業コードがmmod_rectsのベクトルを定義:

std::vector<mmod_rect> rects; 

そしてそれはラインとベクトルにプッシュ:

rects.push_back(rectangle(left, top, right, bottom)); 

Iは、上記で混乱していますライン。 rectsはmmod_rectsのベクトルであり、rectのベクトルではないので、コードがコンストラクタを呼び出してrectに渡して、それをベクトルにプッシュするのはどうでしょう。なぜこれはコンパイラエラーを投げないのですか?私はそれはそれは言うmmod_rectの構造体定義の行、に関係してい前提としています

mmod_rect(const rectangle& r) : rect(r) {} 

私の理解では、これはあなたが長方形への参照を渡すことによってmmod_rectを構築することができることを意味していることです。私は誰かが、まさにこの構文が何をするのか説明できる場合はコロン

: rect(r) {} 

を使用して構文で混乱していて、一back操作はここでどのように機能するか、それは素晴らしいことです。

今私が尋ねたいと思う主なものに。私の目標は、ignoreフラグが1にセットされているmmod_rectsでベクトルrectを生成することです。これをどうやってやりますか?次のコードは目標を達成するでしょうか?

mmod_rect r(rectangle(left, top, right, bottom)); 
r.ignore = 1; 
rects.push_back(r); 

ignored_mmod_rectを使用してこれを行うより良い方法はありますか?私はコードが何をしているか完全に理解していません。

答えて

1

コンストラクタ内のコロンの後にあるものは、「メンバ初期化子リスト」です。参照:http://en.cppreference.com/w/cpp/language/initializer_listまたは "C++メンバー初期化リスト"を検索してください。 mmod_rectrectangleから構築することができるので

実際mmod_rectstd::vectorrectangleを押す理由があります。 C++では、1レベルの暗黙のコンストラクターを使用できます。このような状況で自動的に使用されないようにするには、コンストラクタにexplicitというマークを付けることができます。

rectangleおよびmmod_rectは、「値」タイプです。これは、あなたがそれらがたとえそうだったかのように扱うことを意味します。数字。 (しばしば洗練された型は、部分構造を共有するか、簡単にコピーできないように扱われなければならない)。ignored_mmod_rect関数は単純にある値を別の値に変換する。これはおそらくmmod_rect上の方法を介して行われます、今日一流のAPIの設計では

rects.push_back(ignored_mmod_rect(rectangle(left, top, right, bottom)); 

ので、1だけで書くことができrectangleの初期化子リストベースのコンストラクタがあるでしょう:これはあなたのような何かを書くことができますrectangle(left, top, right, bottom)の代わりに{left, top, right, bottom}です。

+0

いくつかの用語を解説していただきありがとうございます。メンバ初期化子リストのドキュメントを見ることは、何が起こっているのかを理解するのに役立ちました。 –

関連する問題