class array??



  • serprime schrieb:

    ABER: bei dem prototypen gibt man doch nur var-typ ohne var-namen an...

    Vollkommen egal, kannst sowohl mit als auch ohne Bezeichner deklarieren.

    serprime schrieb:

    Hierbei geht es mir auch um die Übergabe Parameter des Objektfeldes.

    stimmt das so..?

    Nicht ganz.

    template <size_t N>
    void unterprogramm(const Personal (&namen)[N])
    


  • groovemaster schrieb:

    Vollkommen egal, kannst sowohl mit als auch ohne Bezeichner deklarieren.

    Man kann sogar verschiedene Bezeichner bei Prototypen und Implementationen verwenden. Sinn macht das zwar keinen aber der compiler wertet bei den prototypen sowiso nur die typinformation aus.
    Kurt



  • thx

    @grovemaster:
    kannst du mir das mit dem template erklären. und warum ich die klammern brauche.
    also ich bin jetzt leicht verwirrt.

    das kann doch nicht so schwer sein ein objekt-feld zu übergeben

    liebe grüße serprime



  • Ist es auch nicht, wenn du nen std::vector verwendest.



  • *seufz*

    hab ich schon erwähnt, dass ich in der 3. klasse wirtschaftsinformatik bin?? wir haben mit klassen erst begonnen.. aber ich wills wissen. kann mir das bitte jemand so erklären dass ich damit was anfangen kann??

    verzweifelte grüße serprime



  • Du kannst natürlich auch

    void unterprogramm(const Personal namen[])
    // oder
    void unterprogramm(const Personal* namen)
    

    schreiben. Nur ist dann namen eben ein Zeiger, und kein richtiges Array mehr. Sofern dies nicht notwendig ist, ist diese Schreibweise für dich evtl. sinnvoller.

    Die Templatisierung ist nur dann sinnvoll, wenn du eben ein builtin Array hast, welches unterschiedlich gross sein kann. Ansonsten kannst du das auch weglassen.

    void unterprogramm(const Personal (&namen)[5])
    

    Was die Klammerung betrifft, nun, das wird halt von C++ syntaktisch so verlangt. Da die eckigen Klammern Vorrang haben, würde das vom Compiler sonst als

    void unterprogramm(const Personal &(namen[5]))
    

    ausgewertet werden, was nicht korrekt wäre.



  • Hallo Serprime,

    ein Array wird in C und C++ immer als Zeiger übergeben, d.h. per Referenz funktioniert nicht.

    Richtig muß es heißen:

    void unterprogramm(Personal namen[]) // oder auch (Personal *namen)
    {
       namen[0].showname();
    }
    

    Leider weiß jetzt das "unterprogramm" die Größe des Arrays nicht.
    Daher entweder noch übergeben, also

    void unterprogramm(Personal namen[], size_t size)
    {
       for(size_t i = 0; i<size; i++)
         namen[i].showname();
    }
    

    Oder noch besser die STL verwenden:

    typedef std::vector<Personal> VPersonal;
    
    void unterprogramm(const VPersonal &namen) // jetzt Übergabe als konstante Referenz auf vector
    {
       for(size_t i = 0; i<namen.size(); i++)
         namen[i].showname();
    }
    

    In der Main dann den Vector initialisieren:

    int main()
    {
       VPersonal namen;
    
       Personal p("Th");
       namen.push_back(p);
    
       p.SetName("Horst");
       namen.push_back(p);
    
       unterprogramm(namen);
    

    Jetzt mußt du nur noch den Konstruktor von Personal sowie die Methode SetName definieren...

    class Personal
    {
       std::string sName;  // <-- std::string ist besser als char*
    public:
      Personal(const std::string &name)
        : sName(name)   // <-- hier Initialisierungsliste
      {}
    
      void SetName(const std::string &name)
      {
        sName = name;  // <-- hier einfach string kopieren
      }
    }
    

    So, für diese Lehrstunde berechne ich 15,- -)



  • Th schrieb:

    ein Array wird in C und C++ immer als Zeiger übergeben, d.h. per Referenz funktioniert nicht.

    In C nicht, in C++ schon. 😉



  • thx an alle die mitgeholfen haben, ich habs mit hilfe eines freundes gelöst.

    hier das schema:

    #include <iostream>
    using namespace std;
    
    class MyClass {
    public:
    	int iTest;
    	void MyClass();
    };
    
    MyClass::MyClass()
    {
    	iTest = 5;
    }
    
    void TestFunktion(MyClass *pTest)
    {
    	pTest[1].iTest = 7;
    }
    
    int main(void)
    {
    	MyClass Bertel[2];
    	Bertel[1].iTest = 6;
    	cout << "Bertel 1: " << Bertel[0].iTest << endl;
    	TestFunktion(Bertel);
    	cout << "Bertel 2: " << Bertel[1].iTest << endl;
    
    	return EXIT_SUCCESS;
    }
    


  • Hmmmmmmmmm 😕 😕 😕
    Dein Freund kann das wohl auch nicht soo guuut.

    Seit wann haben Konstruktoren Rückgabewerte. Und wenn eh alles öffentlich in der Klasse ist dann benutzt doch lieber struct und nicht class...........



  • Wie wäre es mit nem klassischen set und get ?

    serprime schrieb:

    #include <iostream>
    using namespace std;
    
    class MyClass {
    public:
    	MyClass():iTest(5){}//Initialisierungsliste statt zuweisung im c-tor.
    	void set(const int i){iTest=i;}//setzt den wert des obj auf übergebenes i
        const int get()const{return iTest;}// gibt den wert der obj-var zurück , zB für ausgaben wie unten
    private:
    	int iTest;//damit das Atribut privat sein kann : public get methode.
    };
    
    int main()
    {
    	MyClass Bertel[2];
    	Bertel[1].set(6);
    	cout << "Bertel 1: " << Bertel[0].get() << endl;
    	Bertel[1].set(7);
    	cout << "Bertel 2: " << Bertel[1].get() << endl;
    	return 0;
    }
    

Anmelden zum Antworten