2014-10-09 2 views
0

그래서 필요한 경우 다양한 길이를 가질 수 있도록 템플리트를 사용하여 Vector라는 구조체가 있습니다. Vector의 요소를 저장하는 배열을 포함합니다.C++ 행렬의 단일 행에 대한 참조 반환

template <class T = float, int N = 3> 
struct Vector 
{ 
    T data[N]; 

및 또 다른 매트릭스는 데이터 배열에서 N * N 요소를 가진 벡터입니다. 매트릭스의 기능 중 하나에서

template <class T = float, int N = 3> 
struct Matrix : public Vector <T, N*N> 
{ 
    Matrix() {} 

는, 그 벡터에 대한 변경도 매트릭스의 행 변경되도록 벡터로는 "행"중 하나를 반환해야합니다.

inline Vector<T, N>& operator[](int row) 
{ 
} 

어떻게해야할지 모르겠다.

+0

해당 행의 첫 번째 요소를 가리키는 포인터를 가리키는 포인터를 반환 할 수는 있지만 사용자의 취향에 맞지 않을 수 있습니다. 대신에'Matrix' 객체에 대한 참조를 포함하는'Matrix :: Row' 클래스를 가질 수 있으며, 그 행까지 인덱스하는'operator []'를 가질 수 있습니다. – cdhowie

+0

@cdhowie 반환 형식이 Vector &이 될 필요가 있다고 언급해야합니다. 그것은 숙제를위한 것이지만, 나는 이것을 어떻게하는지를 기억할 수 없습니다. – Sizdian

+1

'struct Matrix : public Vector '이 필요하거나 이것을 변경할 수 있습니까? –

답변

0

i- 번째 행의 데이터는 data[i*N]에서 시작합니다.

사용법
template <class T = float, int N = 3> 
struct Matrix : public Vector <T, N*N> 
{ 
    Matrix() {} 
    T* operator[](int i) 
    { 
     return &data[i*N]; 
    } 
}; 

: 이제

struct Matrix : public Vector <Vector<T, N> , N> 

:

Matrix<int, 10> m; 
m[5][5] = 10; 
+0

'data [I * N]'은 참조 일 것이며'& data [I * N]'은'I' 번째 행의 시작을 가리키는 포인터가 될 것입니다. –

2

당신이 당신의 Matrix 클래스가 아니라 하나의 선형 벡터보다 "벡터의 벡터"로 변경해야 나에게 보인다 Vector에 대한 operator[]의 올바른 구현을 가정 할 때 원하는 동작을 무료로 얻을 수 있습니다.

+0

자연스럽게 보이기 때문에이 옵션은 OP에게는 적합하지 않습니다. C++ 11, btw에서'using' 템플릿 별칭으로이 작업을 수행 할 수 있습니다. [샘플] (http://pastebin.com/1egCDyjB). – WhozCraig

0

찾고있는 것이 개별 요소를 해결할 수 있다면 함수 호출 연산자를 대신 오버로드하는 방법을 고려할 수 있습니다.

template <class T = float, int N = 3> 
struct Matrix : public Vector <T, N*N> 
{ 
    Matrix() {} 
    T& operator()(int row, int col) 
    { 
     return /*element*/; 
    } 
}; 

모든 요소에 액세스 중간 Vector에 대한 요구없이 Matrix 클래스를 통해 이루어집니다 이런 식으로.

는 는 사용 후하게

:

Matrix< int, 10 > m; 
m(5, 5) = 10; 
0

대답은 내가 완전히 내가 설명은 data+N*row 생각 프로세스를 이해하지 못하는 요소에 대한 포인터에

return *(Vector<T, N>*)(data+N*row); 

을 제공 었죠 시작하고자하는 배열을 가리킨 다음 포인터를 벡터 유형 포인터로 캐스팅 한 다음 역 참조하여 다른 곳으로 보내고 사용할 수 있습니다. 아마 더 적합한 누군가가 설명에서 설명 할 수 있습니다.