2013-06-07 3 views
0

중첩 된 전략 패턴을 만들려고했습니다. 중첩 된 부모 클래스를 완전히 가상으로 만들 때와 같은 오류가 발생합니다. 이 아이디어는 가능한가?C++ 중첩 된 전략 patterne, 순수 가상 오류

예 : 다음 오류

class Jacobi { 
private: 
    mat _V, _A; 
    int _n, _rotations; 

public: 
    class DiagAlg { 
    public: 
    virtual void diagonalize() = 0; 
    }; 
    class Cyclic : DiagAlg { 
    public: 
    void diagonalize(); 
    }; 

    vec getE(); 
    mat getV(); 
    mat getA(); 
    int getRotations(); 
    Jacobi(Jacobi::DiagAlg DA); 
    Jacobi(const mat& A); // could be done without user supply of base vectors 
    bool rotate(int p, int q); 

}; 

Resulst는 :

jacobi.h:28:26: error: cannot declare parameter ‘DA’ to be of abstract type ‘Jacobi::DiagAlg’ 
jacobi.h:15:9: note: because the following virtual functions are pure within ‘Jacobi::DiagAlg’: 
jacobi.h:17:16: note: virtual void Jacobi::DiagAlg::diagonalize() 

구현은 원인의 CPP 파일 것이다.

+0

주 구현. '_'을 완전히 이끌지 않는 것이 가장 좋습니다. –

답변

2

매개 변수를 값 대신 참조 (또는 포인터)로 전달해야합니다.

Jacobi(Jacobi::DiagAlg const& DA); 

(또한, 관련이없는 메모, 밑줄 및 대문자로 시작하는 식별자를 사용하지 않습니다. 사람들이 구현을 위해 예약되어 있습니다.) _V`가 예약되어 식별자가`것을

+0

감사합니다. 내가 궁금해하는 또 다른 점은 하위 클래스 "순환"에서 부모 개인 변수에 가장 원활하게 액세스하는 방법 이었습니까? "Cyclic"이 Jacobi의 부모 생성자를 호출해야합니까? 이것을 인터페이스에 적용하는 방법이 있습니다. 내가 볼 수 있듯이, "DiagAlg"의 가상 생성자를 만드는 것은 의미가 없습니다 ... – Theis

1

규칙을 사용하면 추상 클래스의 인스턴스를 만들 수 없습니다. 가치에 의해 지나가는 것은 그것을 강요합니다. 수정하려면 & 또는 const &을 추가하십시오.