C++ allg. Array als (pvt) Objekt einer Klasse?

Tintenfaß

Grünschnabel
Guten Tag,

Als Programmier - und Forumsnewbie bitte ich jegliche Form- und andere Fehler zu entschuldigen.

Ich programmiere mit Suselinux ein C++ Programm und möchte eine Klasse basteln, die als privates Datenelement einen Array einer anderen Klasse hat. In dieser Form klappt es wunderbar, keine Probleme:

Code:
class Haar
{
	public:
		Haar() {itsLength = 3;}
		~Haar() {}
		int GetLength() const {return itsLength;}
		void SetLength (int length) {itsLength = length;}
	private:
		int itsLength; 
};

class Cat
{
	public:
		Cat() {SetNiesen();}
		~Cat() {}
		int GetNiesen() const {return itsNiesen;}
		void SetNiesen () {itsNiesen = itsHaar[0].GetLength() * 2;}
		Haar GetHaar () const {return itsHaar[0];}
		void SetHaar(Haar Farbe) {itsHaar[0] = Farbe;}
		
	private:
	int itsNiesen;
	Haar itsHaar[1];
	
};
Ich möchte nun aber die Größe des Arrays allgemeiner deklarieren: also die rote 1 im Code durch eine Variable (k) ersetzen, die ich während des Programmablaufs festlegen möchte. Aber der Compiler gibt unter anderem folgende Fehlermeldung aus:

error: ISO C++ forbids initialization of member ‘k’
error: making ‘k’ static
error: ISO C++ forbids in-class initialization of non-const static member ‘k’
error: array bound is not an integer constant

Wie könnte ich mein Programm richtig realisieren? Wo muß ich diese Variable deklarieren?

Offenbar paßt es dem Compiler nicht, daß ich eine allgemeine Variable für die Größe des Arrays setze. Aber in einfacheren Programmen kann man durchaus die Größe eines Arrays in einer Variable ausdrücken. Was mach ich falsch?

Vielen Dank im Voraus für Eure Hilfe
 
Hi.

Wie dir der Compiler bereits verraten hat kannst du ein (in der Größe dynamisches) Array nicht so als Mitglied einer Klasse deklarieren.

Eigentlich solltest du einfach einen Vektor (std::vector) benutzen. Da sparst du dir viel Ärger.

Desweiteren solltest du dein Array (bzw. Vektor) dann im Konstruktor der Klasse initialisieren.

Bsp:
C++:
class X {
  Haar* itsHaar; // ein Array
public:
  X () : itsHaar(0) { itsHaar = new Haar[k]; }
  ~X() { delete[] itsHaar; }
};

Als Vektor:
C++:
#include <vector>

class Y {
  std::vector<Haar> itsHaar;

public:
  Y() : itsHaar(k) {};
};
Gruß
 
Hey deepthroad,

Vielen Dank für Deinen Tipp. Über Vektoren wußte ich bisher noch gar nichts, werd ich mich mal kundig tun :)

Zu Deinem Vorschlag mit dem Array - Die Bücher, in denen ich nachgeschaut hatte, hatten sämtlich als allgemeine Faustregel, daß man so viele Datenelemente wie möglich als privat deklarieren sollte. Ist das hier nicht möglich?
 
Tintenfaß hat gesagt.:
Zu Deinem Vorschlag mit dem Array - Die Bücher, in denen ich nachgeschaut hatte, hatten sämtlich als allgemeine Faustregel, daß man so viele Datenelemente wie möglich als privat deklarieren sollte. Ist das hier nicht möglich?
Die Datenelemente sind als privat deklariert.

Gruß
 
Zurück