2016-09-18 3 views
0

많은 템플릿 함수를 템플릿 클래스의 friend 함수로 편리하게 선언하는 방법은 무엇입니까?클래스의 친구로 많은 함수 선언하기

예 : 단계 1,2,3 다양한 기능의 각각에 대해 반복받을

template <typename T> 
void funct1(MyClass<T> & A); //1.forward declaration. 

template <typename T> 
class MyClass{ 
    protected: 
    T a; 
    friend funct1(MyClass<T> & A); //2.declare friend 
} 
template <typename T> 
void funct1(MyClass<T> & A){ //3.actual implementation 
    ++A.a; 
} 

....

이 뭔가에 모든 기능이 그룹에 가능하고 모든 것을 선언 뭔가 템플릿 클래스의 친구입니까?

+3

? 어쩌면 디자인을 재고해야 할지도 모릅니다. –

+0

나는 n 차원 배열 사이에 수학을위한 작은 라이브러리를 쓰고있다. myclass는 n 차원 배열 객체입니다. 함수는 ndarrays에서 작동하는 많은 수학 연산입니다. 나는 모든 기능을 ndarray 객체의 메소드로 만들 수 있습니다. 흠. 하지만 죄 (ndarray A) 대신에 A.sin()과 같은 것을 얻습니다. 그것은 약간 이상하다고 느낀다. – rxu

+1

배열의 요소를'iterator' 또는'operator []'로 노출시켜야 할 수도 있습니다. 단순히 함수를 '친구'로 만드는 것은 좋은 생각이 아닙니다. 그렇지 않으면 새로운 함수를 추가 할 때마다'MyClass'를 수정해야합니다. –

답변

2

친구 클래스에 대한 모든 기능을 하나 개의 친구 클래스로 갈 수있는 방법 : 너무 많은 친구 기능이있어 왜

#include <iostream> 

using namespace std; 

template <typename T> 
class MyFriend; 

template <typename T> 
class MyClass{ 
    protected: 
     T a; 
    public: 
     MyClass(T _a):a(_a) {} 

    friend MyFriend<T>; 
}; 

template <typename T> 
class MyFriend { 
    public: 
    void funct1(MyClass<T> &A) { 
    ++A.a; 
    cout << "A.a: " << A.a << endl; 
    } 

    void funct2(MyClass<T> &B) { 
    B.a += 2; 
    cout << "A.a: " << B.a << endl; 
    } 

}; 

int main() { 
    MyClass<int> myclass(0); 
    MyFriend<int> myfriend; 

    myfriend.funct1(myclass); 
    myfriend.funct2(myclass); 

    return 0; 
} 
2

예! 그들에게 class의 구성원 함수를 static으로 만들고 classfriend으로 만들 수 있습니다.

template <typename T> 
class MyClass{ 
    protected: 
    T a; 
    friend class MyFunctions; 
} 
관련 문제