# Dynamisches Array in Klasse anlegen



## Krikus (9. Juni 2009)

Hi,

ich habe eine Controllerklasse "Kundenverwaltung" und eine Klasse "Kunde"
Über diese Controllerklasse möchte ich nun über eine Methode "kunden_anlegen" ein neues Kundenobjekt anlegen. Dazu will ich eine dynamisches Array erzeugen, welches einfach imemr eins hochzählt bei einem neuen Kunden. Allerdings bekomme ich folgende Fehlermeldung:

'kunde::kunde(const kunde &)' : cannot convert parameter 1 from 'int' to 'const kunde &'

Hier einmal der Code:



```
class kundenverwaltung  
{

private:

	kunde *kundenarray;
	int size;


public:

 
kundenverwaltung();
~kundenverwaltung();
void kunde_einloggen();
 void kunde_ausloggen();
 void kunde_anlegen();

};

kundenverwaltung::kundenverwaltung():size(0)
{
}
/*
~kundenverwaltung()
{
	delete [] kundenarray;
}*/
void kundenverwaltung::kunde_einloggen()
{
	string mail;
	int pw;
	cout << "Bitten geben Sie Ihre E-mail ein: " <<endl;
	cin >> mail;
	cout <<"Bitte geben Sie Ihr Passwort ein: " <<endl;
	cin >> pw;

}
void kundenverwaltung::kunde_ausloggen()
{
	
}
void kundenverwaltung::kunde_anlegen()
{
	kundenarray = new kunde(size++);
	
}
```


----------



## deepthroat (9. Juni 2009)

Hi.





Krikus hat gesagt.:


> ```
> void kundenverwaltung::kunde_anlegen()
> {
> kundenarray = new kunde(size++);
> ...


Ein Array wird mit dem new[] Operator angelegt. Du erzeugst hier eine neue Instanz von kunde und versuchst den Konstruktor kunde::kunde(int) aufzurufen.

Selbst wenn du den richtigen Operator verwenden würdest, würdest du damit ein neues Array anlegen, das alte überschreiben und somit ein Speicherleck produzieren. Desweiteren hättest du dann immer noch keinen Kunden erzeugt.

Warum nimmst du nicht einfach einen std::vector<kunde>?

Gruß


----------



## Krikus (9. Juni 2009)

Danke für die Antwort.
Die Sache mit dem Vektor ist mir garnicht in den Sinn gekommen. 

Allerdigns bekomme ich da den selben Fehler. 
Hab irgendwie nen Brett vorm Kopf.



```
....
private:
vector <kunde>kundenarray;
....

void kundenverwaltung::kunde_anlegen()
{

	kunde *newobjekt = new kunde;
	kundenarray.push_back(newobjekt);
	cout <<"Kunde wurde angelegt!"<<endl;
	
}
```


----------



## deepthroat (9. Juni 2009)

Krikus hat gesagt.:


> Danke für die Antwort.
> Die Sache mit dem Vektor ist mir garnicht in den Sinn gekommen.
> 
> Allerdigns bekomme ich da den selben Fehler.


Da in dem Vektor keine Zeiger gespeichert sind, brauchst du auch keine Objekte dynamisch mit new erzeugen.

Gruß


----------



## Krikus (9. Juni 2009)

Ich glaub ich hab nen Fehler in meiner Denkweise.

Für jeden Kunden erzeuge ich eine neues Kundenobjekt, welches ich als Zeiger in dem Vector speicher will. 
Somit hätte ich dann im Vector viele Zeiger stehen und jeder Zeiger zeigt auf ein Kundenobject -> ein Kunde


----------



## deepthroat (9. Juni 2009)

Krikus hat gesagt.:


> Ich glaub ich hab nen Fehler in meiner Denkweise.
> 
> Für jeden Kunden erzeuge ich eine neues Kundenobjekt, welches ich als Zeiger in dem Vector speicher will.
> Somit hätte ich dann im Vector viele Zeiger stehen und jeder Zeiger zeigt auf ein Kundenobject -> ein Kunde


Wozu willst du dafür unbedingt Zeiger verwenden? Benötigst du Polymorphie?

Gruß


----------



## Krikus (9. Juni 2009)

Polymorphie brauch ich keine.
In einer ähnlichen Aufgabe habe ich es so gemacht, allerdings mit statischen Arrays.

Jetzt mit dynamisch bekomme ich das nicht auf die Reihe.
Wenn alles nichts hilft, dann leg ich mir wieder ein festes Array mit 100 Kundenobjekten an und arbeite so erstmal weiter.


----------



## deepthroat (9. Juni 2009)

Krikus hat gesagt.:


> Polymorphie brauch ich keine.
> In einer ähnlichen Aufgabe habe ich es so gemacht, allerdings mit statischen Arrays.
> 
> Jetzt mit dynamisch bekomme ich das nicht auf die Reihe.
> Wenn alles nichts hilft, dann leg ich mir wieder ein festes Array mit 100 Kundenobjekten an und arbeite so erstmal weiter.




```
void kundenverwaltung::kunde_anlegen()
{
    kundenarray.push_back(kunde());
    cout <<"Kunde wurde angelegt!"<<endl;   
}
```
Gruß


----------



## Krikus (9. Juni 2009)

So meckert der compiler nicht mir, Allerdings bekomme ich nun beim ausführen der Methode eine Zugriffsverletzung.

"Access violation reading location 0xccccccd8."

welche sich auf folgende Methode der Klasse vector bezieht:


```
size_type size() const
		{	// return length of sequence
		return (_Mylast - _Myfirst);
		}
```


----------



## deepthroat (9. Juni 2009)

Krikus hat gesagt.:


> So meckert der compiler nicht mir, Allerdings bekomme ich nun beim ausführen der Methode eine Zugriffsverletzung.
> 
> "Access violation reading location 0xccccccd8."
> 
> ...


Der Fehler liegt an der Stelle wo du die size() Methode aufgerufen hast.

Gruß


----------



## Krikus (9. Juni 2009)

Diese Methode rufe ich bewusst nicht auf. 
Es seiden er ruft diese automatisch auf.
An dem Code hat sich nichts geändert, welchen du gepostet hast.


----------



## deepthroat (9. Juni 2009)

Krikus hat gesagt.:


> Diese Methode rufe ich bewusst nicht auf.
> Es seiden er ruft diese automatisch auf.
> An dem Code hat sich nichts geändert, welchen du gepostet hast.


Ja, aber vermutlich an deinem? Zeig mal den konkreten Code.


----------



## Krikus (9. Juni 2009)

```
class kundenverwaltung  
{

private:

	vector <kunde>kundenarray;
	int size;


public:

 
kundenverwaltung();
~kundenverwaltung();
void kunde_einloggen();
 void kunde_ausloggen();
 void kunde_anlegen();

};

kundenverwaltung::kundenverwaltung():size(0)
{
} 
void kundenverwaltung::kunde_anlegen()
{	


	kundenarray.push_back(kunde());
	cout <<"Kunde wurde angelegt!"<<endl;
	
}

class kunde  
{

private:

string passwort;
int kundenid;
string vorname;
string nachname;
string strasse;
int hausnummer;
int plz;
string ort;
string email;

public:


	void set_passwort(string const& x);
	void set_kundenid(int const& x);
	void set_vorname(string const& x);
	void set_nachname(string const& x);
	void set_strasse(string const& x);
	void set_hausnummer(int const& x);
	void set_plz(int const& x);
	void set_ort(string const& x);
	void set_email(string const& x);

	string const& get_passwort() const;
	int const& get_kundenid() const;
	string const& get_vorname() const;
	string const& get_nachname() const;
	string const& get_strasse() const;
	int const& get_hausnummer() const;
	int const& get_plz() const;
	string const& get_ort() const;
	string const& get_email() const;


};
```


----------



## Krikus (9. Juni 2009)

Manchmal könnt ich mich selber schlagen.
Fehler gefunden. 
Klasse wurde falsch aufgerufen.


----------



## Online-Skater (9. Juni 2009)

Übrigens brauchst du bei der Klasse "Kundenverwaltung" keine Variable "size" stattdessen machst du eine Methode welche die Größe des Vektors (Anzahl Elemente = Anzahl Kunden) zurückgibt. 

mfg


----------

