저는 매트릭스 클래스를 작성하고 있습니다. 다음 정의를 살펴보십시오.파생 된 템플릿은 멤버 함수의 반환 유형을 재정의합니다. C++
template <typename T, unsigned int dimension_x, unsigned int dimension_y>
class generic_matrix
{
...
generic_matrix<T, dimension_x - 1, dimension_y - 1>
minor(unsigned int x, unsigned int y) const
{ ... }
...
}
template <typename T, unsigned int dimension>
class generic_square_matrix : public generic_matrix<T, dimension, dimension>
{
...
generic_square_matrix(const generic_matrix<T, dimension, dimension>& other)
{ ... }
...
void foo();
}
generic_square_matrix 클래스는 행렬 곱셈과 같은 추가 기능을 제공합니다. 는 이렇게하면 아무 문제가 없다 :
generic_square_matrix<T, 4> m = generic_matrix<T, 4, 4>();
타입이 때문에 생성자에, generic_square_matrix되지 않더라도, M 어떤 정방 행렬을 할당 할 수 있습니다. 이는 데이터가 하위 항목간에 변경되지 않고 지원되는 기능 만 변경 될 수 있기 때문에 가능합니다. 가능한 경우 :
generic_square_matrix<T, 4> m = generic_square_matrix<T, 5>().minor(1,1);
동일한 변환이 여기에 적용됩니다. 하지만 지금은 문제가 온다 :
generic_square_matrix<T, 4>().minor(1,1).foo(); //problem, foo is not in generic_matrix<T, 3, 3>
내가 generic_square_matrix :: generic_matrix 대신 generic_square_matrix를 반환 사소한 싶습니다이 해결합니다. 이렇게하는 유일한 방법은 템플릿 전문화를 사용하는 것입니다. 그러나 전문화는 기본적으로 개별 클래스처럼 취급되므로 모든 기능을 재정의해야합니다. 파생 된 클래스를 사용하는 것처럼 비 전문 클래스의 함수를 호출 할 수 없기 때문에 전체 함수를 복사해야합니다. 이것은 매우 훌륭한 일반 프로그래밍 솔루션이 아니며 많은 노력을 필요로합니다.
C++에는 거의 내 문제에 대한 해결책이 있습니다. 파생 클래스의 가상 함수는 기본 클래스가 반환하는 클래스에서 파생 된 경우 기본 클래스가 반환하는 다른 클래스에 대한 포인터 또는 참조를 반환 할 수 있습니다. . generic_square_matrix 은 generic_matrix에서 파생 된이지만 함수는 포인터도 참조도 반환하지 않으므로 여기서는 적용되지 않습니다.
이 문제에 대한 해결책이있을 수 있습니다 (아마도 완전히 다른 구조가 포함될 수 있습니다. 필자의 유일한 요구 사항은 치수가 템플릿 매개 변수이며 사각형 매트릭스가 추가 기능을 가질 수 있다는 것입니다). 사전에
감사합니다,
루드
대단히 감사드립니다. 멋지고 단순하며 우아한 솔루션입니다 (적어도이 경우). 서로 다른 클래스에서 다른 멤버를 호출해야하기 때문에 서로 다른 이름을 사용하면 좋지 않습니다. 기본적으로 동일한 작업을 수행합니다. minor() _could_는 무료 함수로 구현 될 수 있지만 멋진 OOP 솔루션은 아닙니다. 단, 부 번호는 행렬의 속성입니다. 함수 숨기기가 "우수 사례"가 아닐 수도 있지만,이 경우에는 함수 구현 자체가 변경되지 않기 때문에 생각합니다. (그리고 더 좋은 행렬 클래스를 허용합니다.) – Ruud
@Ruud : 자유 함수가 객체의 인터페이스에 속한다고 주장 할 수 있습니다. [ "비회원 기능이 캡슐화를 향상시키는 방법"(http://www.drdobbs.com/184401197). –
@Ruud : OO는 모든 문제에 대한 해결책이 아니라 끝을내는 수단입니다. C++은 __multi-paradigm__ 언어이며 패러다임이 섞여있는 곳에서 가장 밝게 빛납니다. STL은 그 좋은 예입니다. 얼마나 강력한 지 알아보십시오. 상속이 전혀없고 대부분의 알고리즘은 컨테이너 멤버가 아닌 자유 함수입니다. – sbi