1

나는 전략 패턴의 좋은 예를 웹에서 살펴 봤지만 예제는 단순화되었습니다.전략 패턴 이해

MyMatrix 클래스를 구현하고 싶습니다. 이 경우 전략 패턴을 사용합니다. 즉 Matrix 클래스를 만들고 두 개의 상속 클래스 인 RegMatrix와 SparseMatrix를 구현 방식이 다릅니다.

MyMatrix가 Matrix (* _matrix라고 함)에 대한 포인터를 보유해야한다는 것을 알고 있고, 예를 들어 MyMatrix의 "print"함수를 구현하려면 다음을 수행해야합니다. _matrix-> print() 적절한 구현을 선택합니다.

내가 이해하지 못하는 것은 배열 및 매트릭스 크기를 가져 오는 MyMatrix의 생성자에서 Matrix의 특정 객체를 선택하여 초기화해야합니까? I는 I 이렇게해야 의미 :

MyMatrix::MyMatrix(double arr[], unsigned int colSize, unsigned int rowSize) 
{ 
    _colSize = colSize; 
    _rowSize = rowSize; 
    _matrix = new RegMatrix(arr, colSize, rowSize); 
} 
+0

전역 네임 스페이스와 다양한 이름의 호스트에 이어지는 밑줄이 있으므로 언더 스코어 접두사를 사용하는 것보다 밑줄 접미사를 사용하는 것이 안전합니다 –

답변

3

공통 변형 생성자 인터페이스 (매트릭스)의 인스턴스를 전달하는 것이다.

MyMatrix::MyMatrix(const Matrix& behaviour): 
    colSize(behaviour.getCols()), rowSize(behaviour.getRows()), matrix(behaviour) 
{ 
} 

// creation 
MyMatrix m(SparseMatrix(4, 2, arr)); 

이니셜 라이저를 사용하십시오. 불필요한 밑줄을 사용하지 마십시오. Alf 님의 댓글보기 colSize 및 rowSize는 Matrix 구현에서 복제되므로 필요하지 않습니다.

1

C++ std::function에서는 전략 패턴의 일반적인 구현으로 볼 수 있습니다. 단어 “ 패턴 ”은 구체적 구현이 될 수는 없다는 것을 의미하지만, 그 모순을 다루는 것은 어렵지 않습니다. ’. 예 : 그것을 단순히 무시함으로써. C++의 전략 패턴의 내 의견 좋은 예에서


은 일반적인 정리 시설, 범위 가드입니다. C++에서 범위 보호를 구현하는 것은 구현에 대한 포인터와 같은 전략 패턴의 내부 요소를 다루는 것이었고 Petru Marginean은 임시 참조 바인딩의 수명 연장을 활용하여 an ingenious way을 발명했습니다.

class Scope_guard 
{ 
private: 
    function<void()> cleanup_; 

    Scope_guard(Scope_guard const&) = delete; 
    Scope_guard& operator=(Scope_guard const&) = delete; 

public: 
    void dismiss() { cleanup_ = []{}; } 

    ~Scope_guard() { cleanup_(); } 

    Scope_guard(function<void()> const& cleanup) 
     : cleanup_(cleanup) 
    {} 
}; 

및 C++ 스타일 코딩 직접 C 스타일 인터페이스를 사용하기 위해

void foo() 
{ 
    Handle const  h = createThingy(); 
    Scope_guard const h_cleanup([=]{ destroyThingy(h); }); 

    // Using h here. 
} 

처럼 사용할 : C++ 11 범위 가드 클래스 사소 std::function 표현된다.

면책 조항 1 : 컴파일러의 손길이 닿지 않는 코드.

면책 조항 2 : 전략 패턴과 구현 측면을 공유하지만 간단한 정리 (즉, 단일 작업)가 “ 알고리즘 ”인지 여부는 완전히 명확하지 않습니다.