멤버 함수와 수학 연산자의 비 멤버 함수


12

저는 행렬, 벡터 등이 포함 된 선형 대수 라이브러리 (긴 이야기로, 학교 과제입니다)를 작성하고 있습니다.이 라이브러리를 만드는 과정에서 객체에 대해 수학 연산을 수행하는 함수를 만들 것입니다. 예를 들어, 행렬 전치, 행렬 반전, 벡터 정규화 등

이런 종류의 함수에 대한 "모범 사례"가 무엇인지 궁금합니다. 즉, 함수를 멤버 함수 또는 비 멤버로 만들어야합니까? (명확성 / 라이브러리 사용을 위해)

예:

//Member function way:
B = A.transpose();
C = A.inverse();

//Non-member function way:
B = linalg::transpose(A); //Non-member transpose function in linear algebra namespace
C = linalg::inverse(A);

이런 종류의 작업에 관한 표준이 있습니까? 아니면 사람들이 이것을하는 일반적인 방법이 있습니까? 첫 번째 옵션을 기대하고 있지만 이것이 권장되는지 알고 싶습니다.

답변:


7

이것은 스타일과 맛의 문제 일뿐입니다. 다른 선형 대수 라이브러리를 보았습니다.

  • 멤버 함수를 사용하여 OOP 스타일로 작성

  • 무료 기능 만 사용하여 비 OOP 스타일로 작성

  • 둘 다 API 제공

그들 모두는 일하고있었습니다. 적어도 API는 일관성이 있어야하므로 선택을 선택하고 해당 스타일을 임의로 혼합하지 마십시오.


8

멤버쉽 비용을 피하십시오 : 가능하면 비회원이 아닌 기능을 수행하는 것을 선호하십시오.

비회원 비 친구 함수는 종속성을 최소화하여 캡슐화를 향상시킵니다. 함수의 본문은 클래스의 비공개 멤버에 의존 할 수 없습니다 (항목 11 참조). 또한 분리 가능한 기능을 해방하기 위해 모 놀리 식 클래스를 분리하여 커플 링을 추가로 줄입니다 (항목 33 참조). 오퍼레이션이 주어진 유형의 멤버인지 여부를 모르는 템플리트를 작성하기 어렵 기 때문에 일반성을 향상시킵니다.

허브 셔터


1
마지막으로 좋은 대답 : 늦었지만 너무 늦지는 않았습니다. ;-) 또 다른 참고 문헌 : GotW # 84 : Monoliths "Unstrung"
중복 제거기

1

멤버 및 비 멤버 함수는 단순한 맛 외에도 실질적인 이점이 있습니다. 예를 들어 matrix클래스 를 구현하는 데 사용되는 기본 배열 은 아마도 private이므로 friend멤버 함수 를 사용 하지 않는 한 사용해야합니다. 이와 관련하여 OO 디자인이 더 나을 수 있습니다.

그러나 때때로 컴퓨터 과학자들은 자신의 실제 행동을 항상 알지 않고도 복잡한 수학 공식을 구현해야한다는 점을 명심하십시오. 그렇게해야 할 때, "시각적"결과가 원래 수학 공식에 더 가깝기 때문에 (비공식은 일반적으로 기능적 스타일을 사용하기 때문에) 멤버가 아닌 함수를 선호합니다.

결국, 답변은 Doc Brown의 답변과 동일합니다. 맛의 문제입니다. 간단히 말해서, 멤버 함수 (작성하기 쉬운, no friend) 로 OO 스타일 라이브러리 를 작성한 다음 멤버가 아닌 함수를 작성하여 해당 인수를 멤버에게 전달하는 동일한 작업을 수행하는 것을 고려할 수 있습니다. 일관성을 유지하고 사용자가 자신이 생각하는 것을 가장 잘 선택할 수 있도록합니다.


0

문제 설명을 자세히 살펴보면 어느 시점에서 특정 수학적 엔터티를 나타내는 사용자 지정 데이터 구조를 사용하는 것이 분명합니다. 예를 들어, n 차원 배열의 수단 인 행렬을 나타낼 수 있습니다. 예를 자세히 설명하기 위해

// C way
typedef struct {
    int data[MAX_LEN][MAX_LEN];
} MATRIX;

MATRIX B = transpose(A);

// C++ way
class Matrix; // Forward Declaration
class Matrix {
    int data[MAX_LEN][MAX_LEN];
    public:
        Matrix transpose();
};

Matrix B = A.transpose();

(C ++ 예제는 단순화되어 템플릿 등을 사용할 수 있습니다.)

고려해야 할 사항은 두 경우 모두 사용자 지정 데이터 구조를 쉽게 사용할 수 있다는 것입니다. 언어로서의 C ++ (또는 모든 객체 지향)은 그 자체로 더 강력하며 구현 자에게 혜택을주는만큼 라이브러리 소비자에게까지 확장됩니다. 과거에는 C 전용 라이브러리를 사용해 왔으며 이러한 사용자 정의 데이터 구조는 모든 시간에 즉시 완료되는 것 같습니다! 상호 운용성은 후자와 상호 작용하기가 더 쉬운 반면 (특별 생성자를 사용하는 것입니까?)

감추려면 C ++을 사용하는 경우 객체 지향 접근 방식이 권장됩니다.


5
죄송합니다, 당신의 추론에는 확실한 사실이 거의 없습니다. 두 transpose예제 사이의 사용 편의성에는 차이가 없습니다 . C ++가 더 쉬운 주된 이유는 복사 및 할당 의미가 실제로 작동하기 때문입니다. A = BC로 컴파일 할 수는 있지만 아마도 잘못된 일을 할 것입니다.
MSalters

복사 의미론에 +1 내가 도달하려는 요점은 느슨하게 결합 된 구조와 관련 함수 집합을 사용하여 객체 ( "표현"에 대한 캡슐화) v / s를 사용하는 것입니다.
dotbugfix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.