Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » referenzen als klassenvariablen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.09.2008, 14:29 Uhr
enigma



hallo,
ich bin relativ neu bei c++ habe aber schon einiges an erfahrung mit java, nun wollte ich zwei meiner vorhandenen java klassen nach c++ portieren, ich bekomme allerdings immer probleme:
beide klassen sollten von objekten der jeweils anderen klasse referenzen als private membervariablen besitzen.
dabei streikt dann mein compiler
hier mein code(vereinfacht):

C++:
/*
* NeuronConnection.h
*/


#ifndef NEURONCONNECTION_H_
#define NEURONCONNECTION_H_

#include "Neuron.h"

using namespace std;
class NeuronConnection {

private:    
    Neuron& source;
    Neuron& target;    

    string description;

public:
    NeuronConnection(Neuron& source, Neuron& target);
    virtual ~NeuronConnection();

    inline double getCost();//rückgabe mit kopierkonstruktor
    const inline string& getDescription();//rückgabe als referenz
  
    const inline Neuron& getSource();
    const inline Neuron& getTarget();
  
};

#endif /* NEURONCONNECTION_H_ */


C++:
/*
* Neuron.h
*/


#ifndef NEURON_H_
#define NEURON_H_

#include <list>

#include "NeuronConnection.h"

using namespace std;

class Neuron {

public:
    Neuron();
    //Neuron(string desc);
    virtual ~Neuron();

    //referenz übergabe, liste könnte geändert werden const sollte das verhindern!
  
    void addPredecessorConnections(const list<NeuronConnection>& c);
    void addSuccesorConnections(const list<NeuronConnection>& c);
    void addPredecessorNeurons(const list<Neuron*>& n);
    void addSuccesorNeurons(const list<Neuron*>& n);

    const inline list<NeuronConnection*>& getPredecessorConnections();
    const inline list<NeuronConnection*>& getSuccesorConnections();
    const inline list<Neuron*>& getPredecessorNeurons();
    const inline list<Neuron*>& getSuccesorNeurons();  

private:  
    list<Neuron*> preNeurons;/*vorgaengerneuronen*/
    list<Neuron*> sucNeurons;/*nachfolgerneuronen*/

    list<NeuronConnection*> preConnections;/*vorgaengerverbindungen*/
    list<NeuronConnection*> sucConnections;/*nachfolgerverbindungen*/

};
#endif /* NEURON_H_ */

es kommt immer der fehler:
Neuron.h:28: error: `NeuronConnection' was not declared in this scope
und folgefehler natürlich.

wenn ich jedoch alle vorkommen der jeweils anderen klasse auskomentiere lässt sich alles einfwandfrei kompilieren.

ps: ich benutze den g++ compiler von mingw und eclipse ganymed als ide, alles auf winxp

Dieser Post wurde am 11.09.2008 um 14:36 Uhr von enigma editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.09.2008, 14:52 Uhr
enigma



hmm wies aussieht lässt sich das problem beheben wenn ich folgendes mache:

C++:
#include...
class NeuronConnection;
class Neuron{...}

und
C++:
#include ...
class Neuron;
class NeuronConnection{...}


kompilerfehler sind weg, kann mir nun wer erklären warum?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.09.2008, 14:58 Uhr
ao

(Operator)


Problem: Die .h-Files inkludieren sich gegenseitig, und die Klasse, die als erste inkludiert wird, kennt die andere nicht.

Der Geheimtipp heißt "Vorwärts-Deklaration":

C++:

class Neuron; // Vorwärts-Deklaration macht den Namen bekannt.

class NeuronConnection {

    Neuron & source;  // geht hier gut.
    Neuron & target;

// ....
};



Umgekehrt genauso (NeuronConnection vorwärts-deklarieren vor der class Neuron {... }; )

Da du innerhalb der Deklaration class Neuron { } nur Referenzen auf NeuronConnection benutzt, ist Wissen über den Aufbau von NeuronConnection hier nicht erforderlich - es reicht zu wissen, dass es sich um einen Datentyp handelt.

Erst bei der Implementierung der Klasse (im .cpp-File) muss bekannt sein, wie man mit einem NeuronConnection-Objekt umgehen kann.

Dann noch die #include-Anweisungen aus den .h-Files raus und in die .cpp-Files rein, und fertig.

Dieser Post wurde am 11.09.2008 um 15:00 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.09.2008, 15:08 Uhr
enigma



okai, vielen dank für die schnelle erklärung

in java ist das irgendwie alles viel einfacher xD

grüße enigma
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2008, 09:56 Uhr
xXx
Devil


Bitter getter const ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: