auf protected variablen einfach zugreifen
-
aha cool
wenn ich also
const CArray& A::GetMyArray() const { return myArray; }habe, könnte ich ohne kopiervorgänge einfach
for ( int i = 0; i < meineAvariable.GetMyArray.GetSize(); i++ ) { // wichtiges meineAvariable.GetMyArray.Append( meineZahl); } // oder müsste ich temp = meineAvariable.GetMyArray(); // und jetzt mit temp arbeiten?vielen dank für eure hilfe

-
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 seinstd::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