2017-11-01 10 views
0

기본 질문에 답하는 것을 좋아하지 않는 사람들을위한 공정한 경고 : 오랫동안 C++ 코드를 많이 보지 못했습니다. 내가 묻는 것은 기본적인 문법적 인 것들이다. 나는 단지 질문을 공식화하기위한 언어에 대해 충분히 알지 못한다. 나는 google에 무엇을 모른다. 바라건대 여러분 중 일부는 내 질문을 응집력있는 것으로 편집하는 것을 도와 줄 수 있기를 바랍니다.Dlib : 무시 플래그가 1로 설정된 mmod_rect를 초기화하는 방법은 무엇입니까?

그래서 문제가 있습니다. 나는 현재 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입니다. 기본적으로 rectangle은 left, top, right 및 bottom에 대해 정수를 전달하여 초기화되는 클래스입니다. 이어서

std::vector<mmod_rect> rects; 

을는 라인 벡터에 밀어 : I 위 혼란하고

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

다음

I 먼저 구비 된 작동 코드 mmod_rects 벡터를 정의 선. rect는 mmod_rects의 벡터이며 rect의 벡터가 아니므로 코드가 생성자를 호출하여 rect에 대해 호출하고 벡터에 푸시하는 방법은 무엇입니까? 왜 컴파일러 오류가 발생하지 않습니까? 나는 그것이라고 mmod_rect의 구조체 정의의 라인과 관련이있다 가정

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

나의 이해는 이것이 당신이 사각형에 대한 참조를 전달하여 mmod_rect를 구성 할 수 있다는 것을 의미한다는 것이다. 난 그냥 사람이 바로이 구문이 무엇을 설명 할 수있는 경우 콜론

: rect(r) {} 

를 사용하여 구문에 의해 혼란 스러워요, 그리고와 push_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++ member initializer list"를 검색하십시오. mmod_rectrectangle로 구성 될 수 있기 때문에

실제로 mmod_rectstd::vectorrectangle 밀기 이유이다. C++은 암시 적 생성자의 한 수준을 사용할 수 있도록합니다. 이러한 상황에서 자동으로 사용되지 않도록 생성자는 explicit으로 표시 할 수 있습니다.

실제로 rectanglemmod_rect은 "값"유형입니다. 즉, 예를 들어 마치 마치 치료할 수 있음을 의미합니다. 번호. (종종 더 정교한 형식은 하위 구조를 공유하거나 쉽게 복사 할 수없는 것처럼 취급되어야합니다.) ignored_mmod_rect 함수는 단순히 하나의 값을 다른 값으로 변환합니다.이것은 가능성이 mmod_rect에 방법을 통해 수행 될 것이다, 오늘 최고 수준의 API 디자인에

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

그래서 하나가 바로 쓸 수 rectangle에 대한 초기화리스트 기반의 생성자이있을 것입니다 : 이것은 당신이 뭔가를 쓸 수 있습니다 rectangle(left, top, right, bottom) 대신 {left, top, right, bottom}입니다.

+0

일부 용어를 분해 해 주셔서 감사합니다. 회원 초기 자 목록에 대한 문서를 보면 상황을 이해하는 데 도움이되었습니다. –