2013-02-20 4 views
0

다른 것들 중에서도 상태 패턴을 적용하여 코드를 리팩토링하려고합니다. 나는, 그래서 좋은 주시기 바랍니다 자바 프로그래머의 더 해요, 그래서, 여기에 내가 공상 내 기본 상태 클래스, 아무것도 없어 한) :참조를 사용하여 상태 패턴 구현

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

#include "FaceRegion.hpp" 

class AlghorithmState { 
public: 
    AlghorithmState(FaceRegion context); 
    virtual ~AlghorithmState(); 
    virtual cv::Mat processImage(cv::Mat frame) = 0; 

private: 
    FaceRegion CONTEXT; 

}; 

와 자식 중 하나가 상태 :

class HaarClassifierState : public AlghorithmState { 
public: 
    HaarClassifierState(FaceRegion context); 
    virtual ~HaarClassifierState(); 
    cv::Mat processImage(cv::Mat frame); 
}; 

, 그때 현재 상태를 유지하고 fromImage 방법/기능의 내부에 그것을 processImage를 호출 컨텍스트 클래스있다 :

#include "AlghoritmState.hpp" 
using namespace cv; 

class FaceRegion { 
public: 
    FaceRegion(); 
    virtual ~FaceRegion(); 
    Mat fromImage(Mat& image); 
    void setAlghoritmState(AlghorithmState state); // line 10 
private: 
    AlghorithmState alghoritm; //line 
} 

문제는,이 코드를 컴파일하려고, 나는 GE t 10에서 다음 오류가 발생했습니다.

In file included from AlghoritmState.hpp:15:0, 
       from FaceRegion.hpp:10, 
       from newmain.cpp:93: 
FaceRegion.hpp:35:28: error: ‘AlghorithmState’ has not been declared 
FaceRegion.hpp:39:5: error: ‘AlghorithmState’ does not name a type 

내가 뭘 잘못 했습니까? 나는 CONTEXT 클래스 헤더 파일에 AlghoritmState의 불완전 클래스 선언을 추가하는 시도하지만 그것은 단지 또 다른 오류가 발생합니다 : 감사

In file included from AlghoritmState.hpp:15:0, 
       from FaceRegion.hpp:10, 
       from newmain.cpp:93: 
FaceRegion.hpp:40:21: error: field ‘alghoritm’ has incomplete type 
FaceRegion.hpp:36:10: error: cannot declare parameter ‘state’ to be of abstract type ‘AlghorithmState’ 
In file included from FaceRegion.hpp:10:0, 
       from newmain.cpp:93: 
AlghoritmState.hpp:17:7: note: because the following virtual functions are pure within ‘AlghorithmState’: 
AlghoritmState.hpp:21:21: note:  virtual cv::Mat AlghorithmState::processImage(cv::Mat) 

어떤 힌트를. 당신은 원형이

답변

1

여기에 포함

AlghoritmState.hpp 그 반대의 경우도 마찬가지 FaceRegion.hpp과를 보내고 #include입니다. 포함 가드를 사용하면 한 헤더가 다른 헤더를 볼 수는 있지만 다른 방법은 볼 수 없습니다.

FaceRegionAlghoritmState과 그 반대의 두 가지를 모두 사용하는 것이 문제입니다. AlghoritmState는 인터페이스입니다, 그래서 당신은 당신이이 같이 포함이 멤버 변수를 삭제하고 이런 식으로, 구현에 HaarClassifierState

를 추가해야합니다

  • FaceRegionAlghoritmState
  • HaarClassifierStateFaceRegion을 포함 포함 및 AlghoritmState

볼 수 있듯이 더 이상 순환이 없으며 편집 문제가 발생합니다. 가버 리다.

중요 : 현재 개체를 값으로 저장하고 있습니다. 상속 된 객체를 사용하여이 작업을 수행하면 slicing이되는 경향이 있습니다. 즉, 작아야하는 객체로 끝날 수 있으므로 더러운 일이 발생하게됩니다. 따라서 모든 경우에 수퍼 클래스를 값으로 저장하지 말고 대신 포인터로 저장해야합니다. (어느 것이 당연히 변수의 소유권 문제로 이끌지 만 또 다른 질문을위한 것입니다). 거기에 저장된 실제 수퍼 유형 인 경우에만 수퍼 유형의 멤버 변수 만 가져야합니다.

+0

대단히 설명해 주셔서 감사합니다.이 문제는 저에게 두통을주었습니다 :) 메모로 돌아가서 참조를 사용하기 위해 다시 작성했지만 다른 장애물에 붙어 있습니다. 이렇게되면 다음과 같이됩니다. HaarClassifierState에 .hpp : 'public : HaarClassifierState (FaceRegion & context); virtual ~ HaarClassifierState(); cv :: Mat processImage (cv :: Mat frame); 개인 : FaceRegion 및 CONTEXT; HaarClassifierState.cpp에서' : 'HaarClassifierState :: HaarClassifierState (FaceRegion 및 컨텍스트) : CONTEXT (문맥) {}' –

+0

그리고, FaceRegion.hpp에서 : '클래스 FaceRegion { 공개 : void setAlghoritmState (AlghorithmState & state); 개인 : AlghorithmState & algorithm; }' 초기화 목록에서 변수를 초기화 할 수 없기 때문에 알고리즘 필드를 처음부터 초기화 할 수 없습니다. (또는 할 수 있습니까?) 'FaceRegion :: FaceRegion() : algorithm (HaarClassifierState (* this)) {}' : 오류 : 'HaarClassifierState'유형의 '값'에서 'AlghorithmState &'유형의 비 const 참조를 초기화하지 못했습니다. –