Forum: PC-Programmierung C++: Array oder Liste von Objekten


von Andre008 (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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"...

von PittyJ (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

PittyJ schrieb:
> wobei auto ein blöder Name ist, war früher mal reserviert.
Ist es immer noch. Wird seit dem C++ Standard von 2011 verwendet.

von Daniel A. (daniel-a)


Lesenswert?

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?

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
Noch kein Account? Hier anmelden.