2012-04-13 4 views
-1

C++에서 포인터를 사용하여 클래스 B에서 클래스 A의 메서드 멤버를 호출하려면 어떻게해야합니까? 그건 그렇고 클래스 A와 B는 다른 유형입니다.다른 클래스 유형의 멤버 함수에 변수 가리키기

포인터가 멤버 함수를 가리키고있을 때 클래스 내의 멤버 함수 만 가리킬 수 있다는 것을 읽었습니다. 하지만 어떻게 수업 외부의 멤버 함수를 가리킬 수 있습니까?

예를 들어

: 나는 다음과 같이 실행할 수 있습니다 생각

class A 
{ 
public: 
    int add(int x) 
    { 
     return x+x; 
    } 
}; 

int main() 
{ 
    typedef int (A::*pointer)(); 
    pointer func = &A::add; 
    A objt; 
    B objt2; 

    obt2.*func(2);// the compiler give me an error of incompatible with object type ‘B’ 

    return 0; 
} 
+0

시도 '2' –

+5

@Chet는 : 그 인스턴스에'A' 멤버 함수를 호출한다는 사실을 해결하지 못한다 'B'는 무의미하다. – ildjarn

+1

이 개념으로 해결하려는 모든 문제는 아마도 다른 방법을 사용하면 더 쉽게 해결되고 * 더 나은 방법 일 것입니다. C++에서 메서드와 함수는 Smalltalk 및 다른 순수 OO 언어와 달리 동일합니다. 상속이나 목표를 달성 할 수있는 디자인 패턴과 같은 언어의 실질적인 기능을 사용하려면 솔루션을 재정비하십시오. 실제 목표를 공유하면 누군가가 올바른 접근법을 제안 할 수 있습니다. –

답변

0

: 대신

(*func)(&objt, 2) 

더 나은 선택이 부스트 :: 바인딩을 사용하는 것입니다/부스트 : : 기능 :

boost::function<int(int)> func = boost::bind(&A::add, &objt, _1); 
func(2); 

방금 ​​마치 클래스 B의 메소드 인 것처럼 실행하려고했습니다.다음 BA을 사용 (일부 A의 멤버를 호출)

((A *) &objt2)->add(2); 
+0

나는 그것을 놓쳤다. 제 질문은 @ 쳇 ildjarn이 아닙니다. omnetpp에 클래스를 구현 중입니다. 이 클래스는 시뮬레이션에서 모듈을 정의합니다. 포인터를 사용하여 메소드에 액세스하려고합니다. 이 방법은 시뮬레이션에서 또 다른 클래스를 정의하는 또 다른 클래스에서 구현됩니다. – Vilanova

+3

"친구", 질문이 잘못되었습니다. –

+0

'A'와'B'가 관계가 없다면'(A *) & objt2'를 역 참조하면 UB가됩니다. – ildjarn

0

경우 : 10 그것은 완전히 무의미하지만 당신은 정확성에 대한 관심을 완전히 예측할 수없는 결과로 위험하게 살고 싶어하지 않는 경우,이 작업을 수행하는 것이 더 쉽습니다 BA에 달려 있으며 A의 메서드를 호출 할 수있는 A에 대한 포인터를 B에 제공하면이 코드를 구현할 수 있습니다. 아래 코드 B1 클래스를 참조하십시오.

A의 멤버의 호출을 별도의 객체 - 함수기로 래핑 할 수 있습니다. 템플릿 클래스로 구현하고 메서드 및 인수의 주소 인 A 개체의 주소를 제공하여 일반 솔루션을 만들 수 있습니다. 이를 위해서는 클래스 B2의 구현을 참조하십시오.

class A 
{ 
public: 
    int add(int x) 
    { 
     return x+x; 
    } 
}; 

typedef int (A::*MEMFN)(int); 

class B1 
{ 
public: 
    void InvokeAAdd(A* pA, int x) 
    { 
     cout << "result = " << pA->add(x) << endl; 
    } 
}; 

template<class T, typename TMemFn, typename TArg, typename TRetVal> 
class B2 
{ 
    T* pT; 
    TMemFn memFn; 
    TArg arg; 
public: 
    B2(T* pT, TMemFn memFn, TArg arg) : 
     pT(pT), memFn(memFn), arg(arg){} 

    TRetVal operator()() 
    { 
     return (pT->*memFn)(arg); 
    } 
}; 

int main() 
{ 
    A a; 
    B1 b; 
    b.InvokeAAdd(&a, 2); 

    B2<A, MEMFN, int, int> b2(&a, &A::add, 2); 
    cout << "result (via functor) = " << b2() << endl; 
    return 0; 
} 

출력 (. obt2 * FUNC)

result = 4 
result (via functor) = 4 
관련 문제