Dlib:如何初始化 mmod_rect 并将其忽略标志设置为 1?

Dlib: How to initialize an mmod_rect with its ignore flag set to 1?

对那些不喜欢回答基本问题的人的公平警告:我已经很长时间没有看过 C++ 代码了。我要问的一些是基本语法的东西,我只是对语言了解不够,无法提出问题。我不知道要做什么 google。希望你们中的一些人可以帮助我将我的问题编辑成有凝聚力的东西。

所以问题是这样的。我目前正在从事一个涉及 dlib 的项目。在 dlib 中,有一个名为 mmod_rect 的结构定义为 here.

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。基本上,矩形是一个 class,通过传入左、上、右和下整数来初始化。

我得到的工作代码首先定义了一个 mmod_rects 的向量,如下所示:

std::vector<mmod_rect> rects;

然后它推送到包含以下行的向量:

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

我对上面的行感到困惑。由于 rects 是 mmod_rects 的向量而不是 rects 的向量,代码如何通过调用 rect 的构造函数并将其推到向量上而逃脱。为什么这不会引发编译器错误?我认为它与 mmod_rect 的结构定义中的行有关,它说:

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

我的理解是,这意味着您可以通过传入对矩形的引用来构造一个 mmod_rect。我只是对使用冒号

的语法感到困惑
 : rect(r) {}

如果有人能解释一下这个语法到底是做什么的,以及这里的 push_back 操作是如何工作的,那就太好了。

现在进入我想问的主要问题。我的目标是使用忽略标志设置为 1 的 mmod_rects 填充矢量矩形。我将如何着手执行此操作?以下代码能否实现目标?

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

有没有更好的方法使用 ignored_mmod_rect 来做到这一点?我不完全理解代码的作用。

构造函数中冒号后面的东西是"member initializer list"。请参阅:http://en.cppreference.com/w/cpp/language/initializer_list 或在此处搜索 "c++ member initializer list."

事实上,将 rectangle 推到 mmod_rectstd::vector 上的原因是因为 mmod_rect 可以从 rectangle 构造。 C++ 允许使用一级隐式构造函数。构造函数可以标记为 explicit 以防止在这种情况下自动使用它。

实际上 rectanglemmod_rect 是 "value" 类型。这意味着您可以像对待他们一样对待他们。数字。 (通常必须将更复杂的类型视为共享子结构或无法轻易复制等) ignored_mmod_rect 函数只是将一个值转换为另一个值。你可以这样写:

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

在当今一流的 API 设计中,这可能是通过 mmod_rect 上的方法完成的,并且 rectangle 会有一个基于初始化列表的构造函数,所以可以只写 {left, top, right, bottom} 而不是 rectangle(left, top, right, bottom).