2008-10-29 3 views
11

헤더 파일에 정의 된 기존 클래스에 주 프로그램의 메서드를 추가 할 수 있는지 궁금합니다. 예를 들어 : 파일 CFun.hpp에 정의 class CFun있다, 그러나 우리의 party.cpp 우리가 분명히 CFun.hppC++ 헤더 파일에 정의 된 클래스에 메서드 추가

을 편집하지 않고하는 방법 void hello() {cout << "hello" << endl;};를 추가 할 (불행히도) 건설 :

#include "CFun.hpp" 

class CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

는 반환되지 않습니다 오류 Multiple declaration for 'CFun'

클래스 상속없이 작동시킬 수 있습니까?

답변

9

아니,하지만 당신은 CFun 클래스에 대한 참조/포인터를 취하는 방법을 추가 할 수 있습니다 당신은 단지 개인 데이터에 액세스 할 수 없습니다 할 수있어. litb가 지적한 것처럼이 함수는 CFun과 동일한 네임 스페이스에 있어야합니다. 다행히도 클래스와 달리 네임 스페이스는 여러 위치에 추가 할 수 있습니다.

+1

당신이 그에게 것을 포함 클래스. 그렇지 않으면 Hello (some_cfun) 호출; Hello를 찾지 못할 것입니다. foo :: Hello (some_cfun);를 작성해야합니다. 그러면 ADT가 작동하지 않습니다. –

0

이해할 수 없습니다. 하지만, 일종의 배심원 단련을하고 네임 스페이스 -y 솔루션을 만들 수는 있습니다. 이것은 아마 당신이있을거야 최고입니다

void Hello(CFun &fun) 
{ 
    cout << "hello" << endl; 
} 

: -

3

아니요, 불가능합니다. 특정 클래스에 대해 하나의 정의 만있을 수 있으며 전체 정의 여야합니다. 즉, 클래스에 멤버를 추가하여 다른 위치에 부분 정의를 가질 수 없습니다.

클래스에 멤버 함수를 추가해야하는 경우 클래스 정의 (CFun.hpp 편집)를 변경하거나 CFun에서 새 클래스를 가져와 hello()을 입력해야합니다.

0

그것에 대해 생각한 후에 뭔가 끔찍한 일을 할 수 있습니다. 원하는 반환 유형이 있고 전체 헤더에서 한 번만 언급되는 기능을 CFun에서 찾습니다. void GoodBye()을 예로 들어 보겠습니다.

지금이 콘텐츠와 파일 CFunWrapper.hpp을 만듭니다

#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye() 
#include "CFun.hpp" 
#undef GoodBye 

그런 다음 오직 대신 CFun.hpp의 CFunWrapper.hpp을 포함한다.

하지만 이렇게하지 않는 한, 그렇게하지 않는 것이 좋습니다. 그것은 CFun.hpp의 내용에 따라 매우 깨지기 쉽고 불가능할 수도 있습니다.

+0

CFun.hpp를 수정하는 것과 같습니다. 이것이 작동하는 상황을 생각하는 것은 꽤 어렵지만 헤더 파일을 변경할 수는 없습니다. 나는 그것이 ROFS에있을 수 있다고 생각한다. –

2

C++에서 해당 종류의 구조 (미리 정의 된 클래스에 기능 추가)와 가장 유사한 것은 Decorator 패턴입니다. 그것은 당신이 쫓고있는 것이 아니지만 필요한 것을 할 수 있습니다.

0
class Party : class CFun 

(당신의 party.cpp는)

안녕하세요() 함수를 포함 CFun 물건을 상속합니다.

그래서 ...

Party p; 
p.hello(); 

아니?

2

이것은 상속에 대한 명백한 유스 케이스처럼 보입니다. 새로운 클래스를 정의합니다

#include "CFun.hpp" 

class CFun2 : public CFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

그런 다음 소스 코드에서 CFun2 대신 CFun을 사용합니다.

4

당신은이 같은 클래스를 다시 정의 할 수 있습니다 :

#define CFun CLessFun 
#include "CFun.hpp" 
#undef CFun 

class CFun : CLessFun 
{ 
    public: 
    void hello() {cout << "hello" << endl;}; 
}; 

새로운 헤더 파일 CMoreFun.hpp에 넣고 및 기능이 동일한 네임 스페이스와 같은에 있어야 대신 CFun.hpp

관련 문제