2014-10-13 23 views
5

Próbuję zaimplementować klasę Matrix4x4 dla mojego portu silnika 3D, który wcześniej wykonałem. Oto co mam do tej pory w moim pliku nagłówka:Jak zwrócić tablice dwuwymiarowe w C++

#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 

lecz sposób, który ma zwrócić dwuwymiarową tablicę powoduje ten błąd:

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

przykro mi, jeśli już to pytanie ma odpowiedź, ale odpowiedzi, które znalazłem na tej stronie, zwykle dotyczyły zwracania wskaźników zamiast tablic. Mam nadzieję, że możesz pomóc, dzięki.

+3

return 'wektor >' zamiast? – taocp

+3

@taocp To zupełnie co innego niż tablica 2D. Można przypuszczać, że niektóre kody wymagają, aby dane były ciągłym blokiem. – juanchopanza

+0

Możesz zwrócić 'float [] []'. Ale wektor może być lepszym rozwiązaniem. – magras

Odpowiedz

9

Proponuję użyć std::array. Ale używanie go bezpośrednio w kodzie, jako tablicy wielowątkowej, jest nieco brzydkie. Więc sugeruję aliasu, zdefiniowana jako:

#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; 

następnie użyć go jako:

public: 

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

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

Można użyć aliasu w innych miejscach, jak również, takich jak:

//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; 

Nadzieję, że pomaga.

+0

Jak uzyskać dostęp lub modyfikować elementy 'multi_array'? Przykro mi, nie wiem zbyt wiele o szablonach –

+0

Podobnie jak dostęp/modyfikacja normalnych tablic (tablic C), np. 'M [i] [j] = 10,5'. – Nawaz

+0

Alternatywnie, 'wektor' z' multi_array'. – jxh

0

Przekazywanie tablicy w C lub C++ jest możliwe przez przekazanie wskaźnika do jej pierwszego elementu - wskaźnik jest przekazywany przez wartość.

Jedynym sposobem na przekazanie tablicy przez wartość byłoby enkapsulowanie jej w architekturze , ale w większości przypadków lepiej jest podać wskaźnik, a następnie skopiować wszystkie dane według wartości.

-1

Po prostu zwróć wskaźnik do pierwszego elementu tablicy! :)

+0

Witamy w Stack Overflow, a dzięki za wkład. Ale dodanie kodu do twojej odpowiedzi znacznie poprawiłoby. –