char Array in Basisklasse schreiben



  • Hallo,
    Ich habe ein Problem und drehe hier noch durch. Ich habe eine Basisklasse die als protected Member ein char Name[25] aufweist. Von dieser Klasse erbe ich und möchte jetzt ein neues Objekt von der geerbten Klasse erzeugen. Problem ist, dass ich dieses schei... char array nicht übergeben bekomme. Umwandlung in string darf ich nicht, da das array eine Vorgabe ist. Irgendwie weiß ich gerade nicht weiter. Egal was ich mache, ich bekomme immer irgendwelche Fehler. 😡
    Anbei ein Test-Code bei dem es auch wieder nicht klappt.

    class NameTest
    	{
    
    	public:
    	NameTest::NameTest(int _x, char _name[25]){}
    
    	protected:
    	int x;
    	char name[25];
    
    	};
    
    	class NameTestVererbung:public NameTest
    	{
    	public:
    		NameTestVererbung::NameTestVererbung(int _x, int _y, char _name[25]):NameTest(x,name)
    		{
    			x=_x;
    			y=_y;
    			name=_name;				//Fehler: Der name muss ein veränderbarer Ausdruck IValue sein
    
    		}
    		void out();
    
    	private:
    		//int x;
    		int y;
    	};
    
    	void NameTestVererbung::out()
    	{
    	std:: cout <<"X-Wert: " <<x;
    	std:: cout <<"\nY-Wert: " <<y;
    	std:: cout <<"\n Text:" << name;
    
    	}
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	NameTestVererbung test1(5,4,"Text");
    	test1.out();
    
      return 0;
    }
    

    Wer kann mir helfen? Ich habe jetzt schon wieder so viel gelesen und getestet, dass ich wahrscheinlich vor lauter Bäumen den Wald nicht sehe.



  • man: strcpy bzw man: strncpy sollten helfen.


  • Mod

    Du kannst echte Arrays einander nicht zuweisen. Entweder es bleiben echte Arrays und du kopierst via std::copy_n :

    std::copy_n(_name, 25, name);
    

    Oder, die bessere Methode, du speicherst einen std::string .

    Edit: Was vielleicht noch erwähnenswert ist: Der Konstruktorparameter ist kein Array (da man diese wie gesagt nicht kopieren kann), sondern einfach ein Zeiger. Das Array das demnach übergeben wird könnte jede Größe haben. Man hat auch keine Möglichkeit ein Array zu übergeben das weniger als 25 Elemente hat. Nimm also allerwenigstens noch einen size -Parameter und Prüfe ob dieser zu groß ist, falls du die bessere Methode (nämlich std::string ) nicht übernimmst.



  • Oh man, manchmal könnte es so einfach sein.
    Besten dank für die schnelle Antwort.



  • Ist es möglich die Variablen-Zuweisung der Variablen der Basisklasse direkt in der Hauptzeile des Konstruktors zu machen?
    Sowas zum Beispiel
    [code="cpp"]
    NameTestVererbung::NameTestVererbung(int _x, int _y, char _name[25]):NameTest(x**(_x)**,name)
    [/code]


  • Mod

    Ja. Einfach die Parameter weiterleiten.

    NameTestVererbung(int _x, int _y, char _name[25]) :
        NameTest(_x, _name),
        y(_y)
    {}
    

    Dagegen ist

    : NameTest(x,name)
    

    inkorrekt und erzeugt zudem noch undefiniertes Verhalten. Du leitest nämlich die noch uninitialisierten Member an den Konstruktor von NameTest weiter, was soll er mit ihnen?

    Die copy_n Zeile sollte selbstverständlich im Konstruktor von NameTest stehen. Ich weise nochmals darauf hin dass du std::string verwenden solltest.


Log in to reply