2014-10-13 16 views
5

Ich versuche, eine Matrix4x4-Klasse für meinen Port der 3D-Engine zu implementieren, die ich zuvor gemacht hatte. Hier ist, was ich bisher in meinem Header-Datei haben:Wie zweidimensionale Arrays in C++ zurückgegeben werden

#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 

Aber die Methode, die angeblich die zweidimensionale Anordnung zurück verursacht dieser Fehler:

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

Es tut mir leid, wenn diese Frage bereits hat eine Antwort, aber die Antworten, die ich auf dieser Seite gefunden habe, betrafen normalerweise das Zurückgeben von Zeigern anstelle eines Arrays. Hoffe, du kannst helfen, danke.

+3

zurück 'vektor ' statt? – taocp

+3

@taocp Das ist ziemlich anders als ein 2D-Array. Vermutlich einige Codes benötigen die Daten als zusammenhängenden Block. – juanchopanza

+0

Sie können 'float [] []' zurückgeben. Aber Vektor kann wirklich bessere Lösung sein. – magras

Antwort

9

Ich würde vorschlagen, zu verwenden. Aber es direkt im Code, als Multi-Array, ist ein bisschen hässlich. Also würde ich einen Alias ​​vorschlagen, wie folgt definiert:

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

Dann verwenden Sie es als:

public: 

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

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

Sie können den Alias ​​in anderen Orten als auch verwenden, wie zum Beispiel:

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

Hoffe, dass hilft.

+0

Wie kann ich auf die Elemente von 'multi_array' zugreifen oder diese modifizieren? Tut mir leid, ich weiß nicht viel über Vorlagen –

+0

Genau wie Sie auf normale Arrays (C-Arrays) zugreifen/ändern, z. B. 'm [i] [j] = 10.5'. – Nawaz

+0

Alternativ ein 'Vektor' von' multi_array'. – jxh

0

ein Array Passing in entweder C oder C++ ist möglich, durch einen vorübergehenden Zeiger auf seinen ersten Element- des Zeiger durch den Wert übergeben wird. Die einzige Möglichkeit, Ihr Array als Wert zu übergeben, wäre es, es in eine Struktur zu kapseln, aber in den meisten Fällen ist es besser, einen Zeiger zu übergeben, um dann alle Daten nach Wert zu kopieren.

-1

Geben Sie einfach einen Zeiger auf das erste Element des Arrays zurück! :)

+0

Willkommen bei Stack Overflow, und vielen Dank für Ihren Beitrag. Aber das Hinzufügen von Code zu Ihrer Antwort würde es viel besser machen. –

Verwandte Themen