C++: Array oder Liste von Objekten

Gast #3883793
Hallo,

ich bin dabei viele Objekte zu erzeugen aus folgender Klassenstruktur:
1
class auto: 
2
{
3

4
public:
5
    auto(double d, int x, int y, int z);
6

7
};

Man kann natürlich hingehen und mit
1
Auto car1 (d, x, y, z);
...
1
Auto carN (d, x, y, z);


die 1-N Objekte von Hand erzeugen.


Gibt es eine Möglichkeit dies in ein Array oder Vector Struktur zu 
erzeugen?

Ich will vermeiden dass man"car1", "car2", ...,"carN" Objekt Namen hat.

Ich hätte lieber die Funktionalität von :
1
car[i].methode();

Welche die Menge der Objekte mit einer Schleife durchlaufen werden kann.
Gast #3883803
Zum Glück hat C++ Klassen für Vektoren, Listen, Arrays etc. eingebaut:
http://en.cppreference.com/w/cpp/container/vector
http://en.cppreference.com/w/cpp/container/array
http://en.cppreference.com/w/cpp/container/list
http://en.cppreference.com/w/cpp/container

"auto" ist übrigens ein ungültiger Klassenname, da "auto" ein 
reserviertes Schlüsselwort ist! Ab C++11 hat es auch eine sinnvolle 
Bedeutung. Nenn es lieber "Auto" oder "car"...
Gast #3883808
Ja, steht alles in deinem C++ Buch.

wobei auto ein blöder Name ist, war früher mal reserviert. Also

Auto Stau[100];

Erzeugt ein Array namens Stau mit 100 Autos.

Stau[0].isKaputt(true);

setzt das erste Auto auf defekt. Eines muss ja den Stau auslösen.
#3884090
Andre008 schrieb:
> class auto:
> {
>
> public:
>     auto(double d, int x, int y, int z);
>
> };

"auto" ist ein c-keyword, welches in c++ seit c++11 die neue bedeutung 
'gleicher type wie initialzer' hat, und hier so nicht verwendet werden 
kann. Wolltest du Auto stat auto schreiben? Ausserdem kommt nach "class 
auto" nur dann ein Doppelpunkt wenn die klasse von anderen klassen etwas 
erbt.

Andre008 schrieb:
> Gibt es eine Möglichkeit dies in ein Array oder Vector Struktur zu
> erzeugen?

Wenn ich statische constante Arrays, Vektoren, etc. brauche, verwende 
ich Konstrukte wie sie in folgendem Beispiel vorkommen:
1
// Autos.hpp
2

3
#if __cplusplus < 201103
4
  #define AIT(x) AIT ## x
5
#else
6
  #define LIST(...) {__VA_ARGS__}
7
  #define AIT(x) LIST
8
#endif
9

10
class Auto {
11
  public:
12
    Auto(double,int,int,int);
13
};
14

15

16
// Autos.cpp
17
#include <cstdlib>
18
#include <vector>
19
#include <list>
20
#include <iostream>
21
#if __cplusplus >= 201103
22
#include <array>
23
#endif
24
//#include Autos.hpp
25
Auto::Auto(double,int,int,int){}
26

27
#define AIT1 Auto
28
static const Auto car[] = {
29
  AIT(1)(1,2,3,4),
30
  AIT(1)(1,2,3,4)
31
};
32
static const size_t numAutos = sizeof(car)/sizeof(*car);
33
static const std::vector<Auto> carVector(car, car+numAutos);
34
static const std::list<Auto> carList(car, car+numAutos);
35
#if __cplusplus >= 201103
36
static const std::array<Auto,2> carArray{{
37
  {1,2,3,4},
38
  {1,2,3,4}
39
}};
40
#endif
41
#undef AIT1
42

43
int main(){
44
  std::cout << "Anzahl Autos im c-Array: " << numAutos << std::endl;
45
  std::cout << "Anzahl Autos in der Vector: " << carVector.size() << std::endl;
46
  std::cout << "Anzahl Autos in der Liste: " << carList.size() << std::endl;
47
  #if __cplusplus >= 201103
48
    std::cout << "Anzahl Autos im Array: " << carArray.size() << std::endl;
49
  #endif
50
  return 0;
51
}

Gibt es bei std::array eigentlich eine Möglichkeit ohne die 
Mengenangabe?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.