2010-12-23 3 views
6

pimpl 관용구를 사용할 때 모든 메서드 정의를 클래스 정의 안에 넣는 것이 좋은 생각입니까?클래스 정의에 모든 메서드 넣기

// in A.h 

class A { 
    class impl; 
    boost::scoped_ptr<impl> pimpl; 
public: 
    A(); 
    int foo(); 
} 

// in A.cpp 

class A::impl { 
    // method defined in class 
    int foo() { 
     return 42; 
    } 

    // as opposed to only declaring the method, and defining elsewhere: 
    float bar(); 
}; 

A::A() : pimpl(new impl) { } 
int A::foo() { 
    return pimpl->foo(); 
} 

는 지금까지 내가 아는 한, 클래스 정의 내부의 메서드 정의를 가하고있는 유일한 문제는 (1) 구현 클래스 정의 및 을 포함 파일에서 볼 수 있다는 점이다 (2 : 예를 들어,) 컴파일러는 메소드를 인라인으로 만들 수 있습니다.

클래스가 개인 파일에 정의되어 있고 메서드가 한 곳에서만 호출되므로 인라인은 아무 효과가 없으므로이 경우 문제가되지 않습니다.

클래스 내부에 정의를 넣는 장점은 메서드 서명을 반복 할 필요가 없다는 것입니다.

그래, 괜찮습니까? 알고 있어야 할 다른 문제가 있습니까?

+0

__private__ 파일이란 무엇입니까? – ezpz

+0

@ezpz : 그건 C++ 개념이 아닙니다. 이는 클래스의 사용자가 #include하지 않은 파일이므로 구현 변경이 파일에 영향을주지 않습니다. – Amnon

+0

이것은 정확하게 내가 해왔 던 것입니다. 나에게이 방법은 잘 작동했다. –

답변

3

나는 당신이 당신 자신의 질문에 대답했다고 생각한다 : 두 해결책은 동등하다.

그러나 인라인은 메서드가 한 곳에서만 호출되기 때문에 효과가 없습니다. 함수가 인라인 될 때 ​​추가 호출 이 될 수 있습니다. 그러나 컴파일러는 외부 클래스의 한 줄 전달 호출에서 멀리 떨어져 있도록 최적화되어 있습니다.

마지막으로 나는 맛의 문제라고 생각합니다.

+0

네 말이 맞아.인라이닝에는 * 부정적인 효과가 없다는 것을 의미하므로 인라인 정의를위한 또 다른 프로입니다. – Amnon

1

보통 Impl 내부 클래스에 메서드를 추가하지 않지만 메서드를 인라인으로 정의하면 어떤 문제도 볼 수 없습니다. 그것은 별도의 선언과 정의를 갖는 것보다 훨씬 읽기 쉽습니다.

0

컴파일러가 메서드를 인라인하는지 여부는 컴파일러와 전달 된 매개 변수에 따라 다릅니다.

pimpl 관용어의 경우,이 메서드가 Imp 본문에 정의되어 있는지 여부는 중요하지 않다고 생각합니다. 나는 멤버 변수와 메소드 목록과 같이 무엇이 정말로 중요한지를 쉽게 알기 때문에 개인적으로 외부 정의를 좋아합니다.

2

장점 :

클래스의 모든 코드가 현지화

단점 : 큰 클래스

  • : 스크롤이 필요할 때, 그것은되는 알고하는 것이 더 어려워진다 함수가 속한 클래스.
  • 모든 클래스 선언 후에 함수가있을 때 종속성을보다 쉽게 ​​해결할 수 있습니다. 그렇지 않으면 일부 클래스 선언이 다른 클래스 다음에 이동해야하며 내부 클래스의 상호 종속성이있을 때 클래스 선언 이후에도 일부 함수를 이동해야 할 수도 있습니다.
관련 문제