2012-05-04 5 views
2
내가이 C++ 클래스 선언

분할 C++ 클래스 선언

원래 클래스

나는 .H와 속성 만 공공 및 보호 방법을 보여주고 싶은
class P 
    { 
     private: 
      int id; 
      //some really secret method 
      int secretMethod(); 
     protected: 
      int x; 
     public: 
      P(); 
      int getX(); 
    }; 

을 분할 할 수 있는지 알고 싶어

, 그 클래스의 사용자가 그것을 볼 수없는 곳에 비공개를 다른 곳에서 선언하십시오.

구인 클래스 선언 :

class P 
    { 
     protected: 
      int x; 
     public: 
      P(); 
      int getX(); 
    }; 

편집 :

  1. 내가 클래스의 구현을 변경할 수 있으며, 클래스의 사용자에 대한
  2. 인가 투명 : 나는에 대한 것을 원하는 사용자가 더 적은 정보를 더 쉽게 볼 수 있습니다.
  3. 클래스의 구현을 변경하는 경우 개인 속성 및 메서드를 변경하십시오. 나는 클래스의 사용자를 위해 .h를 변경하고 싶지 않다.
+3

http://en.wikipedia.org/wiki/Pimpl_idiom –

+1

'int int secretMethod();'는 무엇을 원하는지 알 수있을 것입니다. –

+0

왜 실제로 소스 코드가 숨겨져 있어야합니까? – Tibor

답변

3

네, 가능하지만 방법의 직접적인 종류 : 당신의 목적은 단순히 헤더에 혼란을 줄일 경우

0

이런 식으로 뭔가?

class P 
{ 
private: 
    class Impl 
    { 
    public: 
     int id; 
     //some really secret method 
     int secretMethod(); 
    }; 

private: 
    Impl* _pimpl; 

protected: 
    int x; 

public: 
    P() : _pimpl(new P::Impl()) {} 
    ~P() { delete _pimpl; } 
    int getX(); 

}; 
+0

아니요, 아니요, 아니요. 그것은 수업을 전혀 분할하지 않습니다. Impl의 정의가 헤더에 여전히 알려져 있다는 사실은 말할 것도없이 ... – Puppy

+0

코멘트 주셔서 감사합니다. 아마도 나는 너무 빨랐다. – ervinbosenbacher

+1

표준 라이브러리에서 작업하지 않는 한 코드에서 '\ _'접두사를 사용하지 말 것을 권장합니다. 이 경우에는 글로벌 범위가 아니기 때문에 일반적으로 이름 충돌로 드러나는 IDB를 실행하는 경우가 많습니다. '\ _'접두사는 특별한 의미를 지니 며 범위에 따라 다르며 뒤 따르는 것은 ... 형식이 잘못된 프로그램을 작성할 수 있습니다. 그 접두사를 전혀 사용하지 않음으로써 전체를 피하는 것이 가장 좋습니다. –

-1

진정으로 C++ 클래스 정의를 분할 할 수 없습니다. 수행 할 수있는 모든 작업은 PIMPL과 같은 역겨운 해킹을 사용하여 소스 코드를 보호하는 런타임 추상화를 구현하는 것입니다.

class P 
{ 
#include "P.private_parts" 

    protected: 
     int x; 
    public: 
     P(); 
     int getX(); 
}; 
+6

Pimpl 관용구가 왜 끔찍한 지 이유를 설명 할 수있는 타당한 이유가있을 것입니다. OP에서 합리적인 결정을 내릴 수 있도록 이들에 대해 자세히 설명하면 좋을 것입니다. –

+0

@BenjaminLindley : 내 대답은 아니지만 Pimpl 관용구 (예 : 싱글 톤 패턴)는 남용으로 고통 받고 있습니다. * public * 인터페이스 (즉,/usr/include/MyLib에 어떤 라이브러리 클라이언트가 표시되는지)에서 구현을 분리해야합니다. 코드베이스의 * 모든 클래스가 "잘림"되어 있으면 소스가 보이지 않게 불필요하게 디버그하기가 거의 어렵지 않기 때문에 매우 다른 것입니다. – DevSolar

2

, 당신은 클래스의 중간에 파일을 포함 할 수 있습니다. 여기에 당신이 할 것입니다 :

my_object.h :

struct my_object { 
    void fun(); 

    my_object(); 
    my_object(my_object const&); 
    ~my_object(); 

    my_object& operator = (my_object); 

protected: 
    void pfun(); 

private: 
    struct impl; 
    std::unique_ptr<impl> pimpl; 
}; 

my_object.cpp :

당신이 볼 수 있듯이
struct my_object::impl { 
    void fun() { do stuff...} 

    void pfun() { do other stuff... } 

    int private_member; 
}; 

my_object::my_object() : pimpl(new impl) {} 
my_object::my_object(my_object const& o) : pimpl(new impl(*o.pimpl) {} 
my_object::~my_object() {} 

my_object& my_object::operator = (my_object o) { swap(pimpl, o.pimpl); return *this; } 

void my_object::fun() { pimpl->fun(); } 
void my_object::pfun() { pimpl->pfun(); } 

, 그것은 많은 작업이고 힙을 필요로한다. 균형이 잡힌 모든 것 ... 필요할 때 사용하십시오.

+0

Humn .. P.private_parts가 비밀이 될 수 없다고 생각합니다. – Troncador

+0

@ 트론 카도르 : 개인 정보를 숨기고 싶었던 이유가 무엇인지 모르겠다. 티보르 (Tibor)가 물었을 때 그 정보를 자세히 설명하지 않았기 때문이다. 한 가지 가능한 이유는 헤더 파일의 복잡함을 덜어주기를 원했기 때문에이를 해결하는 방법에 답변했습니다. 앞으로는 사람들이 귀하의 게시물 아래에있는 의견에 귀하가 묻는 질문에 답하십시오. 모든 사람이 실제로 성취하고자하는 것을 분명히 알 수 있습니다. –

+0

예를 들어 멤버에 액세스하려면 코드 완성이'P.private_parts'에서 작동하지 않습니다 ... –