Array in Klasse mit Zeichenlänge im Constructor



  • Ich möchte zur Übung eine Klasse erstellen, in der sich ein Array befindet, dessen größe im Constructor festgelegt wird.

    class Wurst
    {
    public:
    	Wurst(int Arraysize);
    	int Arraysize;
    	char Value[int Arraysize];
    	~Wurst();
    }
    

    Mein Problem ist hierbei, dass der Compiler meckert...

    error C2327: 'Wurst::Arraysize': Ist kein Typname, nicht statisch und kein Enumerator

    Wie müsste es aussehen, damit ich im Constructor die größe des Arrays festlegen kann?



  • 1. Es sieht aus, als wärst Du im falschen Forum. Hier geht es um C++/CLI, eine .NET Sprache. Bei Dir sieht es nach C++ aus.
    2. Unter der Annahme es gehe bei Dir um C++: ➡ benutze std::vector<T, ...>

    Simon



  • theta schrieb:

    1. Es sieht aus, als wärst Du im falschen Forum. Hier geht es um C++/CLI, eine .NET Sprache. Bei Dir sieht es nach C++ aus.
    2. Unter der Annahme es gehe bei Dir um C++: ➡ benutze std::vector<T, ...>

    Simon

    std::vector finde ich bei mir nicht. Ich nutze VC++ 2008. Was muss ich denn dazu einbinden?

    Edit: Ok, das mit dem einbinden hab ich herausgefunden (#include <vector>). Aber wie lege ich denn die Dimensionen und größen dieses Vektors fest?

    Edit2: Alles im Lot, ich hab denk ich alles herausgefunden, was ich brauche. 🙂



  • Jetzt habe ich doch ein Problem, auf das ich einfach keine Lösung finde.

    Ich möchte einen Vektor mit einer selbst erstellten Klasse verwenden.

    class Klasse
    {
    
    public:
        Klasse(int Tee)
    }
    
    ...
    
    class Oberklasse
    {
    public:
        int Zahl;
        std::vector<Klasse> Test;
    }
    

    Der Compiler meckert verständlicher Weise, dass kein Standardkonstruktor vorhanden ist. Was müsste ich also machen, um beim erstellen des Vektors dem Klasse-Constructor den Wert der Variable "Zahl" zu übergeben?

    std::vector<Klasse(Zahl)> Test;
    

    Bei dieser Zeile meckert der Compiler wegen dem _TY-Typen oder so. 😞



  • Du kannst dem Konstruktur des vector<> (und der resize()-Methode auch ein Default-Element übergeben, wenn die Klasse nicht default-konstruiert werden kann:

    Oberklasse::Oberklasse() : Test(47, Klasse(11)) {}
    //initialisiere den vector<> mit 47 Kopien des fertig eryeugten Objekts
    


  • CStoll schrieb:

    Du kannst dem Konstruktur des vector<> (und der resize()-Methode auch ein Default-Element übergeben, wenn die Klasse nicht default-konstruiert werden kann:

    Oberklasse::Oberklasse() : Test(47, Klasse(11)) {}
    //initialisiere den vector<> mit 47 Kopien des fertig eryeugten Objekts
    

    Hierbei kommt der Fehler:

    1>d:\eigene dateien\dokumente\visual studio 2008\projects\testprogramm\testprogramm\test.cpp(28) : error C2084: Funktion 'OberKlasse::OberKlasse(int)' hat bereits einen Funktionsrumpf

    Dabei springt er zur Funktion meines Constructors...

    Edit: Das vorherige Problem habe ich nun gelöst. Aber sobald ich im Constructor von Oberklasse auf Test zugreifen möchte, kommt die Fehlermeldung, dass kein geeigneter Standardkonstruktor verfügbar sei. 😞

    [code]OberKlasse::OberKlasse(int p)
    {
    Test.resize(p);
    }



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • GR-Thunderstorm schrieb:

    Hierbei kommt der Fehler:

    1>d:\eigene dateien\dokumente\visual studio 2008\projects\testprogramm\testprogramm\test.cpp(28) : error C2084: Funktion 'OberKlasse::OberKlasse(int)' hat bereits einen Funktionsrumpf

    Dabei springt er zur Funktion meines Constructors...

    Das was CStoll gepostet hat IST der Konstruktor von Oberklasse. Wenn Du schon einen hast, musst Du die Funktionalität diesem natürlich hinzufügen.

    Edit: Das vorherige Problem habe ich nun gelöst. Aber sobald ich im Constructor von Oberklasse auf Test zugreifen möchte, kommt die Fehlermeldung, dass kein geeigneter Standardkonstruktor verfügbar sei. 😞

    OberKlasse::OberKlasse(int p)
    {
    	Test.resize(p);
    }
    

    Auch bei Resize musst Du für diesen Fall dem vector ein Objekt übergeben, welches das Standardobjekt sein soll. Sonst nimmt vector wieder Klasse() an, und da es keinen Standardconstructor gibt...

    Also, übertragen auf das Beispiel von CStoll müsste der Konstruktor so aussehen:

    OberKlasse::OberKlasse(int p) 
    : Test(p, Klasse(11))
    {
        // alternativ: Test.resize(p, Klasse(11));
        // aber nicht beides
    }
    


  • Erstmal danke für eure Hilfe. 🙂 Aber irgendwie will das alles nicht so recht funktionieren... 😞

    Hier mal mein ganzer Code bisher:

    class Klasse
    {
    public:
    	Klasse(int X);
    	int I;
    	~Klasse();
    };
    
    class OberKlasse
    {
    public:
    	std::vector<Klasse> Test;
    	OberKlasse(int p) : Test(4,Klasse(11)) {}
    	~OberKlasse();
    };
    OberKlasse::OberKlasse(int p) : Test(4,Klasse(11)) // : Test(int I,Klasse(int X))  <-- führt zu selbem Fehler
    {
    	p++;
    }
    
    int main()
    {
    	return 0;
    }
    

    Der Fehler besteht weiterhin. 😞

    1>d:\eigene dateien\dokumente\visual studio 2008\projects\testprogramm\testprogramm\test.cpp(29) : error C2084: Funktion 'OberKlasse::OberKlasse(int)' hat bereits einen Funktionsrumpf



  • Du hast ja auch zwei Definitionen für den Konstruktor angegeben - einmal inline in der Klassendefinition, das zweite Mal explizit. Einer von den beiden ist zu viel.
    (PS: Das "p++;" im Konstruktor-Rumpf bringt effektiv gar keinen erkennbaren Effekt 😉



  • class OberKlasse
    {
    public:
    	//Klasse(11) Test;
    	std::vector<Klasse> Test;
    	OberKlasse(int p) : Test(4,Klasse(11)) {}
    	//OberKlasse()
    	~OberKlasse();
    };
    OberKlasse::OberKlasse(int p)
    {
    	p++;
    }
    

    Das p++ ist einfach nur so da. ^^ Es geht nur darum, den Fehler zu finden.

    Obiger Code führt noch immer zum gleichen Fehler. 😞



  • Willst du es nicht begreifen oder kannst du es nicht? Dadurch, daß du den selben Code nochmal hinschreibst, wird er auch nicht besser.

    *tief durchatmet* ruhig blut - es ist Ostern

    Du mußt eine der beiden Konstruktor-Definitionen weglassen, dann klappt es auch. Also entweder

    class OberKlasse
    {
    public:
        //Klasse(11) Test;
        std::vector<Klasse> Test;
        OberKlasse(int p);// : Test(4,Klasse(11)) {}
        //OberKlasse()
        ~OberKlasse();
    };
    OberKlasse::OberKlasse(int p) : Test(4,Klasse(11))
    {
        p++;
    }
    

    oder

    class OberKlasse
    {
    public:
        //Klasse(11) Test;
        std::vector<Klasse> Test;
        OberKlasse(int p) : Test(4,Klasse(11)) {}
        //OberKlasse()
        ~OberKlasse();
    };
    /*OberKlasse::OberKlasse(int p)
    {
        p++;
    }*/
    


  • Tut mir leid, ich bin nunmal kein Informatikstudent sondern mache das ganze nur als Hobby. 😞 Mir was es einfach neu, dass man innerhalb der Klasse eine Funktion schreiben kann.

    Aber nun funktioniert der Code. 🙂 Vielen Dank für die Hilfe. 🙂



  • Es gibt sich mir ein neues, ähnliches Problem.

    Ich möchte auf Knopfdruck einen Vektor des Typs OberKlasse erstellen:

    private: System::Void Testfunktion_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	std::vector<OberKlasse> Testvektor(8);
    	k.resize(4,OberKlasse(4));
    }
    

    Er meckert jedoch mal wieder wegen dem Standardkonstruktor. 😞

    Wenn ich ähnlich wie zuvor versuche, und hinter die rechte Klammer beim Funktionskopf ein : k(4,OberKlasse(4)) setze, meckert er...

    error C2590: "Testfunktion_Click": Nur ein Konstruktor kann eine Basis-/Member-Initialisiererliste enthalten.

    Alternativ hab ich es bei der Komponenteninitialisierung versucht:

    void InitializeComponent(void)
    {
    	this->Testfunktion = (gcnew System::Windows::Forms::Button()) : k(5,OberKlasse(4));
    (...)
    }
    

    error C2143: Syntaxfehler: Es fehlt ';' vor ':'

    Wie müsst ich das anstellen, damit es funktioniert?
    Mein Konstruktor für OberKlasse sieht so aus:

    OberKlasse::OberKlasse(int X=8){...}
    


  • Bist du auf einmal auf .NET umgestiegen? Das ist kein gültiger C++ Standard-Code. Und damit bist du mit der Frage im falschen Forum. Stell mal die Frage in einem neuen Beitrag. Im .NET-Forum wirst du sicherlich mehr Leute finde, die dir helfen können.



  • Ja ich nutze wie gesagt VC++ 2008 und im entsprechenden Forum war der Thread auch anfangs, aber meine Beiträge werden so oder so ständig verschoben. 😞



  • Ja, ist schon richtig, bei deiner urpsrünglichen Frage ging's ja auch um die Implementierung mit der C++ Standardbibliothek, die letzte ist jedoch .NET 🙂


Log in to reply