Liebes Forum, ich habe in C++ eine Klasse für ein zweidimensionales Array implementiert und kann diese auch benutzen: twodim var(2, 2); var[0][0] = 0; und so weiter. Nun ist es mir aber etwas zu umständlich, beispielsweise eine 5x5-Tabelle immer nach diesem Muster zu füllen. In den Sinn kommt mir, eine solche Syntax verwendbar zu machen: int x[5][5] = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, } Kann ich jetzt mit irgendeinem {Assignment-,}Operator sowas emulieren? Das Problem ist, dass 5x5 beliebig mxn sein soll. Gruß, Nico
Nein, weil das keine Zuweisung ist, sondern eine Initialisierung. Da gibt es momentan keinen eleganten Weg für das, was ich vermute was du wilst. Mit dem nächsten C++ wird das wohl besser...
Wenn deine Vermutung richtig ist, hast du wohl recht ;-) Hast du denn irgendwas irgendwie ähnlich Elegantes? Oder geht das in C++ echt nur mit Krücken?
Ein Objekt eines eigenen Datentyps kannst du nicht mit = { ... } initialisieren, sorry. Wenn du dich auf g++ beschränkst, es also nicht portabel sein soll, könnte es gehen.
Danke, Klaus, für den Hinweis. Hast du da ne Syntax oder Direktive zur Hand oder ein Stichwort? Wenn du erst suchen muss, schaue ich sonst selbst nach. Nico
Was ich im Kopf hatte, sind die "compound literals" aus C99, die der gcc bzw. g++ auch bei C++ akzeptiert, zusammen mit einem entsprechenden ctor in der Klasse. Ich hatte mir das so vorgestellt:
1 | class Matrix |
2 | {
|
3 | public:
|
4 | |
5 | Matrix( size_t m, size_t n, double arr[m][n] ) |
6 | : m( m ), |
7 | n( n ), |
8 | pWerte( new double[m*n] ) |
9 | {
|
10 | for( size_t i=0; i<m; ++i ) |
11 | {
|
12 | for( size_t j=0; j<n; ++j ) |
13 | {
|
14 | pWerte[i*n+j] = arr[i][j]; |
15 | }
|
16 | }
|
17 | }
|
18 | |
19 | double &operator()( size_t i, size_t j ) |
20 | {
|
21 | return pWerte[i*n+j]; |
22 | }
|
23 | |
24 | private:
|
25 | |
26 | size_t m; |
27 | size_t n; |
28 | double *pWerte; |
29 | |
30 | }; // class Matrix |
31 | |
32 | ...
|
33 | Matrix m( 3, 2, |
34 | (double[3][2]) |
35 | {
|
36 | { 1.0, 2.0 }, |
37 | { 1.1, 2.1 }, |
38 | { 1.1, 2.1 } |
39 | }
|
40 | );
|
Das geht nur leider nicht so, weil im ctor der Parameter double arr[m][n] nicht akzeptiert wird, wegen noch unbekannten m und n. Wenn man auf die zeilenweise Klammerung der Matrix beim Initialisieren verzichten kann, geht es zumindest so:
1 | #include <iostream> |
2 | |
3 | class Matrix |
4 | {
|
5 | public:
|
6 | |
7 | Matrix( size_t m, size_t n ) |
8 | : m( m ), |
9 | n( n ), |
10 | pWerte( new double[m*n] ) |
11 | {
|
12 | }
|
13 | |
14 | Matrix( size_t m, size_t n, double *arr ) |
15 | : m( m ), |
16 | n( n ), |
17 | pWerte( new double[m*n] ) |
18 | {
|
19 | for( size_t i=0; i<m; ++i ) |
20 | {
|
21 | for( size_t j=0; j<n; ++j ) |
22 | {
|
23 | pWerte[i*n+j] = arr[i*n+j]; |
24 | }
|
25 | }
|
26 | }
|
27 | |
28 | double &operator()( size_t i, size_t j ) |
29 | {
|
30 | return pWerte[i*n+j]; |
31 | }
|
32 | |
33 | private:
|
34 | |
35 | size_t m; |
36 | size_t n; |
37 | double *pWerte; |
38 | |
39 | }; // class Matrix |
40 | |
41 | int main( int nargs, char **args ) |
42 | {
|
43 | Matrix m( 3, 2, |
44 | (double[]) |
45 | {
|
46 | 1.0, 2.0, |
47 | 1.1, 2.1, |
48 | 1.1, 2.1 |
49 | }
|
50 | );
|
51 | |
52 | |
53 | std::cout << "m( 2, 1 ) = " << m( 2, 1 ) << std::endl; |
54 | }
|
Das sieht schon etwas ähnlicher aus wie eine array-Initialisierung in C. Etwas eleganteres sehe ich spontan nicht, sorry.
Keine fertige Lösung, aber ein Ansatz: Schau die mal die Boost-Assignment-Library an. Da werden durch Überladen des ()- und des ,-Operators verrückteste Dinge gemacht, die noch weit über das hinausgehen, was du vor hast, und das alles standardkonform: http://www.boost.org/doc/libs/1_45_0/libs/assign/doc/index.html Ich habe sie mir nicht näher angeschaut, aber mit etwas Glück arbeitet die Library direkt mit deiner Klasse zusammen, mit etwas weniger Glück kannst du sie mittels weiterer Überladungen passend machen. Falls das alles nicht funktionieren sollte, kannst du zumindest die Grundideen übernehmen und etwas Ähnliches selbst schreiben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.