2016-06-09 4 views
0

비슷한 동작이지만 반환 값이 다른 두 클래스가있는 경우이를 구현하는 가장 좋은 방법은 무엇입니까? 예를 들어메소드의 동작이 비슷한 두 클래스를 구현하는 방법

:

class A{ 
    int method1(int a, int b){ ... do something...} 
} 
class B{ 
    float method1(int a, int b){ ... do the same stuff as in class A...} 
} 

나는 세 번째 클래스 C의 모든 중요한 코드를 구현 그것에서 상속에 따라 클래스 A의 래퍼와 B를 작성하는 것입니다에 대해 생각할 수있는 유일한 것은 그들의 반환 값.

더 좋은 방법이 있습니까? A의 방법 항목을 공개해야

class A { 
public: 
    int method1(int a, int b) { 
     return a + b; // your implementation here 
    } 
}; 

참고 : 다음과 같이

+4

자유 함수 함수 템플릿? – Niall

+0

이 예와 관련이 없지만 실제로는 일반적이지 않은 조언을하는 것은 어려울 것입니다. 이것을 여러 목적으로 사용할 계획이라면, 그것들 모두에 적합한 솔루션을 얻기 위해 좀 더 많은 컨텍스트를 제공하는 것이 좋습니다. – chris

+0

"세 번째 클래스 C의 모든 중요한 코드를 상속 받고"[mixin] (https://en.wikipedia.org/wiki/Mixin)이라고도합니다. – dhke

답변

0

또 다른 방법은 CRTP 관용구를 사용 가능할 것이다 : 당신이 C++ (14)를 사용할 수있는 경우이 솔루션은 작동

template<typename T> 
struct C { 
    auto method1(int a, int b){ 
     return static_cast<T*>(this)->method1Impl(a, b); 
    } 
}; 

struct A: C<A> { 
    int method1Impl(int a, int b) { return 42; } 
}; 

struct B: C<B> { 
    float method1Impl(int a, int b) { return .0; } 
}; 

int main() { 
    A a; 
    B b; 

    a.method1(0, 0); 
    b.method1(0, 0); 
} 

참고.

+0

고맙습니다. 좋은 해결책이 될 수 있지만 불행히도 C++ 11 만 사용할 수 있습니다. – gravicapa

0

내가이 보일 것이다, B에게의 자식을 만들어 (상속)이 작업을 수행 할 것 (의 우리가 설명 할 수있는 별도을 가정 해 봅시다) 또는 B가 아동에게 접근 할 수 있도록 보호 (개인이 아닌)해야합니다.

class B : A // Declare that B extends A 
{ 
public: 
    float method1(int a, int b){ 
     return A::method1(a, b); // access method1 from A 
    }; 
}; 

이제 A와 B에서 동일한 반환 방법을 사용할 수 있습니다.

0

이유라도 왜 안 : 일반적인 기능을 직접 멤버 변수를 조작하고 있지만, 가장 간단한 솔루션을 보이는 경우는 조금 더 작업이 필요

namespace 
{ 
    commonFunc(int a, int b) { do common stuff} 
} 

class A{ 
    int method1(int a, int b){ commonFunc(a,b);} 
} 
class B{ 
    float method1(int a, int b){ commonFunc(a,b);} 
} 

.

관련 문제