문제

메인 프로그램의 메소드를 헤더 파일에 정의 된 기존 클래스에 추가 할 수 있는지 궁금합니다. 예를 들면 다음과 같습니다 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();

아니?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top