auf protected variablen einfach zugreifen



  • Ajax! Nein, das wird nicht gehen, da ja der Rückgabewert konstant ist, und somit kann er nicht geändert werden. Man kann in dem Beispiel das CArray nur lesen.

    Wenn man Elemente hinzufügen will, dann muß man sowas machen:

    void A::addElement(ElementX x) {
      myCArray.add(x);
    }
    

    Wenn einem das zuviel Arbeit ist und man will dem User eh die Kontrolle über das CArray geben, würde ich sowas machen:

    class A {
       CArray *myArray;
    public:
       void setMyArray(CArray *myArray) {
          this->myArray = myArray;
       }
    };
    

    Und dann selbst einfach benutzen.



  • erwischt 🤡

    ups sorry, ich hatte schon ein vier zuviel, ich möchte nur lesen draufzugreifen, wie schon gesagt

    for ( int i = 0; i < meineAvariable.GetMyArray.GetSize(); i++ )
    {
    
    // wichtiges
    
    meineAvariable.GetMyArray.ElementAt( i);
    }
    

    so meinte ich das

    danke für die vielen mühen 👍



  • Artchi schrieb:

    const CArray& A::GetMyArray() const {
      return myArray;
    }
    

    Wobei erstes const wichtig ist! D.h. das der Rückgabewert vom Aufrufer nicht geändert werden darf. Du kannst das auch als const Pointer zurück geben, wenn es sich um einen Pointer handelt. Einfach das & durch * austauschen.

    Zweiteres const sagt nur, das die GetMyArray()-Methode keine Änderungen macht, wärend des Aufrufs.

    Danke, aber ich hab ein Problem

    Ich kann jetzt z.b. GetSize() von CArray aufrufen, aber nicht ElementAt()

    da sagt er mir

    error C2662: 'ElementAt' : this-Zeiger kann nicht von 'const class CArray<unsigned long,unsigned long>' in 'class CArray<unsigned long,unsigned long> &' konvertiert werden

    ist es vielleicht weil ElementAt() eine Referenz zurückgibt?

    CArray::ElementAt
    TYPE& ElementAt( int nIndex );

    weiss jemand rat?



  • PS:

    ich habs jetzt so

    class a
    
    protected:
    CArray< unsigned long, unsigned long> variable;
    public:
    const CArray< unsigned long, unsigned long>* GetArray() { return  &variable; };
    
    //dann
    
    const CArray< unsigned long, unsigned long> *temp = a.GetArray();
    
    temp->GetSize();  // geht :)
    temp->ElementAt(i); // geht nicht wegen der fehlermeldung oben :(
    


  • ajax schrieb:

    //dann

    const CArray< unsigned long, unsigned long> *temp = a.GetArray();

    temp->GetSize(); // geht 🙂
    temp->ElementAt(i); // geht nicht wegen der fehlermeldung oben 😞

    [/cpp]

    Der Grund für die Fehlermeldung wurde auf Seite 1 bereits genannt (siehe Post von Ringding).



  • welches von beiden?

    eines ist ja

    Gib eine const Reference darauf nach außen.

    hab ich ja gemacht.



  • Die Lösung ist genau das hier:

    Artchi schrieb:

    Wobei erstes const wichtig ist! D.h. das der Rückgabewert vom Aufrufer nicht geändert werden darf.

    Das zurückgegebene Array ist const und deshalb kannst du nur const Methoden aus der CArray darauf anwenden - und da gehört ElementAt() offenbar nicht dazu.

    Also ist es wohl am besten, wenn du die entsprechenden Zugriffsmethoden direkt in deiner Klasse A implementierst und dieser die Kontrolle darüber läßt, wie sie mit ihrem Array umgeht.

    (PS: Bei deinen Beispielcodes fehlt übrigens ein Klammerpaar - du kannst mit "meineVariable.GetArray**()**.GetSize()" etc auf das Array zugreifen)



  • ok

    ich habe jetzt statt CArray einfach

    std::vector genommen

    da geht es auch nicht 😞 wie mache ich es da? vector müsste ja jedem bekannt sein

    std::vector<unsigned long>	variable;
    const std::vector<unsigned long> *GetArray() const{ return  &variable; };
    
    //dann
    
    t.GetArray()->size();  // geht
    t.GetVisibleTourIds2()[5]; // geht nicht :(
    

    fehlermeldung

    error C2440: 'initializing' : 'const class std::vector<unsigned long,class std::allocator<unsigned long> >' kann nicht in 'unsigned long' konvertiert werden



  • Wenn Du eine Referenz auf den Vektor zurückgibst statt einen Zeiger müsste das erste mit . statt -> und das zweite unverändert gehen.



  • LordJaxom schrieb:

    Wenn Du eine Referenz auf den Vektor zurückgibst statt einen Zeiger müsste das erste mit . statt -> und das zweite unverändert gehen.

    ne, geht leider nicht

    beim ersten wenn ich den .(operator) nehme, dann sagt er mir "muss struktur bla bla bla sein" beim ->(operator) da meckert er nicht mehr


Anmelden zum Antworten