Zeiger auf Klassenmember an andere Klasse übergeben?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Zeiger auf Klassenmember an andere Klasse übergeben?

Beitrag von CKassiopaia »

Hallo,

ich hab ein Problem, was sich glaub ich nicht in 2 Sätzen zusammenfassen lässt. Ich habe ein sehr umfangreiches Programm und versuche mal die wichtigen Dinge zu posten:

Code: Alles auswählen

class ClassA{
public:
    ClassA();
private:
    struct daten{
        int xyz;
        ...
}

    struct daten *pointer;
}   

Code: Alles auswählen

class ClassB{
public:
    ClassB();
    void readClassA(struct daten &pointer);
}   

Code: Alles auswählen

ClassA::ClassA(){
    pointer = new daten[10]
    klasseB=new ClassB;
    klasseB->readClassA(pointer);
...
}

Code: Alles auswählen

void ClassB::readClassA(struct daten &pointer){
...
}
Natürlich ist das bei mir einwenig komplexer, aber der grundaufbau ist wohl gleich:
Klasse A verwaltet eine große Menge an Daten, die im Array stehen.
Klasse B soll den eigentlichen Lesevorgang (von Netzwerk-Sockets) durchführen und alles gelesene dann in das Array speichern.

Der grundsätzliche Programmablauf funktioniert auch. Allerdings schaff ich es nicht, der readClassA-Funktion (die ja in Klasse B definiert ist) den zeiger auf das Array zu übergeben.

Es kommen immer folgende Fehlermeldungen:
no matching function for call to ClassB::readClassA(ClassA::daten&)
canidates are: void ClassB::readClassA(daten&)
Ich habe schon vieles ausprobiert... Referenzen, Zeiger aber irgendwie will das alles nicht...

wenn ich z.B. void readClassA(ClassA::daten &pointer); in ClassB zu definierten, sagt der mir, dass ClassA nicht declariert ist.

Könnt ihr mir helfen, dieses Problem zu lösen? Habt ihr irgendwelche Tips?
Vielen Dank!

P.S.: Wenn ihr vorschläge zu ner Besseren Überschrift habt....immer her damit. Ich wusste nicht, wie ich das Problem in einem Satz beschreiben soll...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Deine Funktion möchte eine const-Referenz, Du übergibst aber einen Pointer.
Und da wir hier bei C++ sind würde ich std::vector<daten> benutzen oder noch besser wenn Du eh Qt verwendest QVector<daten>. Das new würde dann komplett entfallen und Du vergisst das zugehörige delete[] nicht :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Danke...

Beitrag von CKassiopaia »

Gut, das mit den Vektoren werd ich mir morgen mal ansehen... hab hier grad weder nen Buch, noch die eigentliche Software.

Kann ich denn den Vektor, den ich dann wiederum in Klasse A definiert habe an Klasse B weitergeben? Also als Referenz? Weil es müsste ja wiederum ein Vektor eines structs sein...

Code: Alles auswählen

std::vector<struct daten> datenvektor;
Ich hab nämlich mal einfach die struct durch ein einfaches int ersetzt...und dann klappt das problemlos... ;-)

Und zum Thema const-Referenz:
ich hatte auch schon mal:

Code: Alles auswählen

    void readClassA(struct daten *pointer); 
... und diverse andere konstellationen...mit dem struct hab ichs nie hinbekommen... mit nem einfachen int-Array schon...

Kann ich beim Funktionsaufruf irgendwie casten, dass der "daten" nehmen soll und nicht "ClassA::daten"
Oder... kann ich der eigentlichen FUnktio sagen, dass der "ClassA::daten" und nicht "daten" bekommt ... quasi den spieß umdrehen?

Mal davon abgesehen...is das ein gute Programmierstil....unabhängig davon, ob ich nen Array oder Vector habe?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

std::vector<struct daten> ist auch falsch - es muss std::vector<daten> heissen.
Wenn ich die Daten innerhalb einer Funktion nicht verändere ist const std::vector<daten> &data die richtige Wahl. Willst Du was zurückliefern (d.h. die Daten verändern und dann weiterbenutzen) so ist ein Pointer besser (eine nicht-konstante Referenz geht natürlich auch, aber da ist man sich immer unsicher ob die Daten jetzt verändert werden oder ob das const einfach vergessen wurde *g*)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

So.....die vectoren ;-)

Beitrag von CKassiopaia »

Ich hab mir deine Ratschläge zu herzen genommen und mein Programm mit Vectoren umgebastelt :-) Klappt auch wunderbar...

Auch wenn am Schluss der Vektor größer ist, als nötig... (capacity:256 != size:124 ... kann man das angleichen? Resize funktioniert nicht)

Aber...das Problem mit der Übergabe besteht weiterhin...

habe die Funktion jetzt wie angegeben deklariert:

Code: Alles auswählen

void readClassA(const vector<daten> &pointer); 
aber es ist wie gehabt... der sagt mir immer, dass "daten" nicht declared ist...(in this scope) Ist ja auch richtig...ich habe es ja in Klasse A declariert, denn dort liegen ja die Daten!

Naja...wenn ich das struct nocheinmal in Class B declariere...findet der zwar den vector<daten> aber beim Aufruf der Funktion passt mal wieder ClassA::vector<daten> nicht zu ClassB::vector<daten>

Gibts eine Möglichkeit zu Casten? Oder ähnliches?
CLRS530
Beiträge: 155
Registriert: 8. Oktober 2007 18:00

Beitrag von CLRS530 »

Versuch reserve oder zur Not am Ende http://doc.trolltech.com/4.5/qvector.html#squeeze wenn dir die Größe sehr wichtig ist bzw du den Vector lange lesend nutzen möchtest.
CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

Beitrag von CKassiopaia »

Danke...!

ja, der wird einmal erstellt und dann verändert sich die Länge halt nicht mehr....also is der rest verschenkter platz....
achja...hab erstmal den normalen <vector> verwendet... nicht qt!

Aber eigentlich is das andere Problem viel wichtiger :-)
Antworten