2015-02-05 2 views
8

필자는 항상 헤더 파일을 클래스를 설명하는 일종의 '공개 인터페이스'로 생각했습니다.이 경우 cpp 파일에 비공개 필드 및 함수를 유지하는 것이 좋습니다.C++, 개인 함수가 실제로 헤더 파일에 있어야합니까?

개인 필드가 헤더에 있어야 클래스의 인스턴스가 소비 할 메모리 양을 다른 클래스에서 알 수 있지만 개인 도우미 함수를 작성하려고 할 때 발생했습니다. 함수를 정적으로 만들 수 있습니다.이 경우에는 클래스의 일부가 될 필요가 전혀 없으며 클래스 정의의 .cpp 파일에서 정규 함수가 될 수 있습니다.

는 그 다음 모든 개인 기능이 잠재적 클래스 필드에 대한 포인터/참조를 받아들이는 대신 클래스에 정의 될 것으로 예상하여 정적으로 재 작성 될 수 있다는 것을 나에게 발생했습니다.

이렇게하면 헤더 파일에 개인 함수를 선언 할 필요가 없습니다.

나는 이제 내가 물어보고 싶은 규칙을 따르도록 좋아 하는가, 그것은 비 정적 개인 기능 헤더 파일에 있어야한다는, C++로 확립 된 규칙을 고려입니까? 정적 함수 또는 정적 상수는 어떻습니까? 에서 someHelper(int* x) 것을

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

class SomeClass 
{ 
private: 
    int x; 
public: 
    void combineWithX(int y); 
}; 

#endif 

.cpp 파일

#include "SomeClass.h" 

void someHelper(int* x) 
{ 
    *x = (*x) + 1; 
} 

void SomeClass::combineWithX(int y) 
{ 
    someHelper(&x); 
    x += y; 
} 

참고 :

헤더 파일 : 나는에 얻고 무엇을 설명하는 몇 가지 코드에 넣어거야

편집 cpp 파일은 개인 회원 x를 영으로는 참조하지만 직접적으로는 참조하지 않으므로 헤더에 표시 할 필요가 없습니다. 이런 종류의 일이 '나쁜 스타일'로 간주되는지 궁금하네요.

+3

개인 기능을 클래스 내부에서 불러 와야하거나 개인 구성원에 액세스 할 수 없다는 점에 유의하십시오. 그들에게 사적인 멤버가 필요하지 않다면 아마도 그 멤버들이 스스로 멤버가되어서는 안됩니다. –

+1

일단 닫으면 확장을 위해 클래스를 다시 열 수 없기 때문에 (C++ 11 9.2-p2), 네 클래스 함수 * 및 * member vars *를 decl에 결합해야합니다. 원하는 경우 분명히 [pimpl] (http://stackoverflow.com/questions/843389/the-pimpli-idiom-in-practice) 구현을 수행 할 수 있습니다. – WhozCraig

+0

@WhozCraig 덕분에, 나는 원래 더 나쁜 질문에 링크 된 귀하의 링크를 빌 렸습니다. –

답변

7

나는 헤더 파일에 구현 세부 사항을 노출해야하는 데는 문제가 있다는 데 동의합니다. 그것은 인터페이스와 구현의 분리를 방해합니다.

.cpp 파일에서 개인용 보조 기능을 자유 기능으로 옮기는 것 ("정적"이라는 의미 인 것으로 생각됩니다)은 해당 기능이 개인용 멤버 변수에 액세스해야하는 경우 작동하지 않습니다.

당신은 pImpl idiom(more)

8

PImpl 관용구보기 위하여 관심이있을 수는 필요한 경우에만

  1. 당신이 '변수' 공공 헤더 중 (바이너리 호환성을 유지하기 위해 private 멤버를 이동해야하는 경우
  2. ) 새로운 버전의 디자인은 쉽게 이해 할 수 없다면
,

전용 멤버 '기능'을 공용 헤더 밖으로 이동하려는 경우 내부 클래스를 사용하는 것만으로 충분합니다. PImpl 관용구처럼 리디렉션 패널티가 없습니다.

공개..cpp 파일에서 H 파일

#ifndef SOME_CLASS_H 
#define SOME_CLASS_H 

class SomeClass 
{ 
private: 
    struct Private; 
    int x; 
public: 
    void combineWithX(int y); 
}; 

#endif 

#include "SomeClass.h" 

/** Declare all private member functions of SomeClass here 
    This class can access not only private members of SomeClass 
    but also friends of SomeClass. */ 
struct SomeClass::Private 
{ 
    static void someHelper(SomeClass& self) 
    { 
    self.x = self.x + 1; 
    } 
}; 

void SomeClass::combineWithX(int y) 
{ 
    Private::someHelper(*this); 
    x += y; 
} 

SomeClass::Private는 헤더 파일에 그 중 하나를 선언하지 않고 SomeClass의 모든 개인/친구에 대한 전체 액세스 권한을 가지고 헬퍼 함수의 수에는 제한이 없습니다 .