Atxmega: Verschiedene Größen eines Arrays in Objekten

Gast #4414743
Lesenswert?
• ▲
▼
Hallo,

ich habe in einer Klasse ein Array und möchte beim Übersetzen - nicht 
zur Laufzeit! - das jedes Objekt seine eigene Arraygröße hat.

Beispiel:
1
class TestKlasse{
2
  public:
3
    TestKlasse(size);
4

5
    unsigned int arr[???];  //Mit new arbeiten?
6
};
7

8
TestKlasse obj1(100);

Muss ich da mit new arbeiten? Das will ich eigentlich vermeiden..

Danke für die Hilfe :)
#4414770
Lesenswert?
• ▲
▼
Dazu könnte man Templates benutzen:
1
template<int SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4

5
    unsigned int arr[SIZE];
6
};
7

8
TestKlasse<100> obj1;
9
TestKlasse<50>  obj2;
Damit schreibt man den Code einmal und alles andere verwaltet der 
Compiler. Sollte dieser nicht allzu doof sein, wird er nur Code-Teile, 
die wirklich von SIZE abhängig sind, in mehreren Instanzen anlegen.

Verdammt, schon wieder einer schneller ;-)
Gast #4414791
Lesenswert?
• ▲
▼
Nun, aber das eine Objekt braucht vielleicht 100 Felder, das andere nur 
10.

Die Speichergröße möchte ich zum Zeitpunkt der Übersetzung für jedes 
Objekt festlegen, aber nicht nacher zur Laufzeit.
Gast #4414837
Lesenswert?
• ▲
▼
Das ist ja ganz schön verwirrend mit den ganzen <>...
Aber ich habs fast!

Wie kann ich die Tempate Methoden untereinandere sich gegenseitig 
aufrufen lassen?
1
template<int SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4
    void M1();
5
    void M2();
6

7
    unsigned int arr[SIZE];
8
};
9

10
template<int SIZE> 
11
void TestKlasse<SIZE>::M1(){
12
}
13
 
14
template<int SIZE> 
15
void TestKlasse<SIZE>::M2(){
16
  M2();//?????????????????????????????????????????
17
}
18

19
TestKlasse<100> obj1;
20
TestKlasse<50>  obj2;
Gast #4414874
Lesenswert?
• ▲
▼
Jens schrieb:
> template<int SIZE>
> void TestKlasse<SIZE>::M2(){
>   M2();//?????????????????????????????????????????
> }

So ist das schon richtig... Aber verwende "size_t SIZE" und nicht "int 
SIZE", dann ist das portabler, und funktioniert z.B. auch auf x86_64 
korrekt.
#4414901
Lesenswert?
• ▲
▼
Jens schrieb:
> Wie kann ich die Tempate Methoden untereinandere sich gegenseitig
> aufrufen lassen?
>
>
1
> template<int SIZE> class TestKlasse{
2
>   public:
3
>     TestKlasse();
4
>     void M1();
5
>     void M2();
6
> 
7
>     unsigned int arr[SIZE];
8
> };
9
> 
10
> template<int SIZE>
11
> void TestKlasse<SIZE>::M1(){
12
> }
13
> 
14
> template<int SIZE>
15
> void TestKlasse<SIZE>::M2(){
16
>   M2();//?????????????????????????????????????????
17
> }
18
> 
19
> TestKlasse<100> obj1;
20
> TestKlasse<50>  obj2;
21
>

falls du in M2() M1() rufen wolltest, dann geht das.
So wie geschrieben, gibt es nur einen Stack-Überlauf.
Und wie schon oben geschrieben, wenn eine der Methoden tatsächlich von 
SIZE abhängt, dann gibt es die eben mehrfach und die jeweils richtige 
wird gerufen.

Zu der <>-Verwirrung: die Zeit, die man in ein vernüftig gebaute 
Template-Klasse investiert, kommt bei der Benutzung schnell wieder 
zurück. Man kann auch den Typ der Array-Element offen lassen:
1
template<typename T, size_t SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4
    void M1();
5
    void M2();
6

7
    T arr[SIZE];
8
};
9

10
template<typename T, size_t SIZE> 
11
void TestKlasse<SIZE>::M1(){
12
}
13
 
14
template<typename T, size_t SIZE> 
15
void TestKlasse<SIZE>::M2() {
16
    M1();
17
}
18

19
TestKlasse<uint8_t,100> obj1;
20
TestKlasse<double,50>  obj2;

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.