C ++ 헤더 파일에 정의 된 클래스에 메소드 추가 방법
문제
메인 프로그램의 메소드를 헤더 파일에 정의 된 기존 클래스에 추가 할 수 있는지 궁금합니다. 예를 들면 다음과 같습니다 class CFun
파일에 정의됩니다 CFun.hpp
, 그러나 우리 안에 party.cpp
메소드를 추가하고 싶습니다 void hello() {cout << "hello" << endl;};
편집없이 CFun.hpp
분명히 (불행히도) 건축 :
#include "CFun.hpp"
class CFun
{
public:
void hello() {cout << "hello" << endl;};
};
오류를 반환하지 않습니다 Multiple declaration for 'CFun'
클래스 상속없이 작동하게 할 수 있습니까?
해결책
아니요, 그러나 CFUN 클래스에 대한 참조/포인터를 취하는 메소드를 추가 할 수 있습니다. 개인 데이터에 액세스 할 수 없습니다.
void Hello(CFun &fun)
{
cout << "hello" << endl;
}
이것은 아마도 당신이 할 수있는 최선 일 것입니다. Litb에서 지적한 바와 같이 -이 기능은 CFUN과 동일한 네임 스페이스에 있어야합니다. 다행히도 클래스와 달리 네임 스페이스는 여러 곳에 추가 할 수 있습니다.
다른 팁
다음과 같이 클래스를 재정의 할 수 있습니다.
#define CFun CLessFun
#include "CFun.hpp"
#undef CFun
class CFun : CLessFun
{
public:
void hello() {cout << "hello" << endl;};
};
이것을 새 헤더 파일에 넣으십시오 CMoreFun.hpp
대신에 포함하십시오 CFun.hpp
아니요, 불가능합니다. 특정 클래스의 정의가 하나만있을 수 있으며, 완전한 정의가 있어야합니다. 즉, 다른 장소에서 부분 정의를 가질 수 없어 수업에 멤버를 추가 할 수 없습니다.
클래스에 멤버 함수를 추가 해야하는 경우 클래스 정의 (CFUN.hpp 편집)를 변경하거나 새 클래스를 도출해야합니다. CFun
그리고 넣습니다 hello()
거기.
C ++에서 이러한 종류의 구성 (사전 정의 된 클래스에 기능 추가)과 가장 가까운 아날로그는 데코레이터 패턴입니다. 정확히 당신이 따르는 것이 아니지만 필요한 것을 할 수 있습니다.
이것은 상속에 대한 명백한 사용 사례처럼 보입니다. 새 클래스 정의 :
#include "CFun.hpp"
class CFun2 : public CFun
{
public:
void hello() {cout << "hello" << endl;};
};
그런 다음 사용하십시오 CFun2
대신에 CFun
소스 코드에서.
그것에 대해 생각한 후, 당신은 끔찍한 일을 할 수 있습니다. CFUN에서 원하는 반환 유형이있는 기능을 찾으십시오. 전체 헤더에서 한 번만 언급됩니다. 의 말을하자 void GoodBye()
.
이제이 컨텐츠로 파일 cfunwrapper.hpp를 만듭니다.
#define GoodBye() Hello() { cout << "hello" << endl; } void GoodBye()
#include "CFun.hpp"
#undef GoodBye
그런 다음 cfun.hpp 대신 cfunwrapper.hpp 만 포함하십시오.
그러나 그렇게할만한 이유가 없다면 이렇게하지 마십시오. CFUN.hpp의 내용에 따라 파손되기 쉬우 며 불가능할 수도 있습니다.
내 지식이 아닙니다. 그러나 일종의 배심원 자리를 수행하고 네임 스페이스 솔루션을 만들 수 있습니다.
class Party : class CFun
(파티 .cpp)
hello () 함수를 포함하여 CFUN 물건을 상속합니다.
그래서...
Party p;
p.hello();
아니?