2014-10-13 2 views
5

이전에 만들었던 3D 엔진 포트 용 Matrix4x4 클래스를 구현하려고합니다.C++에서 2 차원 배열을 반환하는 방법

#ifndef MAT4_H 
#define MAT4_H 

class Matrix4 
{ 

public: 
    Matrix4() {} 
    float[4][4] getMatrix() { return m; } 
    //... 
    //other matrix related methods are omitted 
    //... 
private: 
    float m[4][4]; 

}; 

#endif 

그러나 2 차원 배열을 반환하도록되어 방법이 오류가 발생합니다 : 여기에 지금까지 내 헤더 파일이 무엇 미안

src/Matrix4.h:13:10: error: expected unqualified-id before '[' token 
    float[4][4] getMatrix() { return m; } 
     ^

경우 이미이 질문에 대답이 있지만이 사이트에서 찾은 대답은 대개 배열 대신 포인터를 반환하는 것이 었습니다. 고마워요, 고마워요.

+3

return'vector >'대신에? – taocp

+3

@taocp 2D 배열과 완전히 다릅니다. 일부 코드는 데이터가 연속 블록이어야한다고 가정합니다. – juanchopanza

+0

'float [] []'을 반환 할 수 있습니다. 그러나 벡터가 실제로 더 나은 해결책 일 수 있습니다. – magras

답변

9

나는 std::array을 사용하도록 제안합니다. 하지만 다중 배열처럼 코드에서 직접 사용하는 것은 약간 추한 것입니다. 그래서 같이 정의 별칭 좋을 것 :

#include <array> 

namespace details 
{  
    template<typename T, std::size_t D, std::size_t ... Ds> 
    struct make_multi_array 
    : make_multi_array<typename make_multi_array<T,Ds...>::type, D> {}; 

    template<typename T, std::size_t D> 
    struct make_multi_array<T,D> { using type = std::array<T, D>; }; 
} 

template<typename T, std::size_t D, std::size_t ... Ds> 
using multi_array = typename details::make_multi_array<T,D,Ds...>::type; 

를 다음으로 사용 :

: 같은

public: 

    multi_array<float,4,4> getMatrix() { return m; } 

private: 
    multi_array<float,4,4> m; 

당신은뿐만 아니라 다른 곳에서 별칭을 사용할 수 있습니다,

//same as std::array<int,10> 
//similar to int x[10] 
multi_array<int,10> x; 

//same as std::array<std::array<int,20>,10> 
//similar to int y[10][20] 
multi_array<int,10,20> y; 

//same as std::array<std::array<std::array<int,30>,20>,10> 
//similar to int z[10][20][30] 
multi_array<int,10,20,30> z; 

희망이 도움이됩니다.

+0

'multi_array '의 요소에 어떻게 접근하거나 수정합니까? 죄송합니다. 템플릿에 대해 많이 알지 못합니다. –

+0

일반 배열 (C- 배열)에 액세스/수정하는 것과 마찬가지로 'm [i] [j] = 10.5'와 같습니다. – Nawaz

+0

또는 'multi_array'의 '벡터'. – jxh

0

C 또는 C++로 배열을 전달하는 것은 첫 번째 요소에 대한 포인터를 전달함으로써 가능합니다. 포인터는 값으로 전달됩니다.

값으로 배열을 전달하는 유일한 방법은 을 구조체에 캡슐화하는 것이지만 대부분의 경우 포인터를 전달하여 모든 데이터를 값으로 복사하는 것이 좋습니다.

-1

배열의 첫 번째 요소에 대한 포인터를 반환하십시오! :)

+0

스택 오버플로에 오신 것을 환영합니다. 그리고 당신의 공헌에 감사드립니다. 그러나 당신의 대답에 약간의 코드를 추가하는 것이 훨씬 더 좋을 것입니다. –

관련 문제