Java in C++ umsetzen



  • Hallo zusammen,
    ich bin seit kurzem in C++ eingestiegen und möchte gern ein kleinem Java-Programm in C++ konvertieren.
    Doch beim Kompilieren bekomme ich aber Fehlermeldung und ich weiß auch nicht, ob ich bei der Portierung richtig gemacht habe.

    Ich hoffe einer von euch kann mir helfen.

    VG, Manh

    Java-Quellcode

    import Layer.java;
    ......
    
    public class Axon 
    {
    
        public Reverse reverse;  
        Layer preLayer=null;
        Layer postLayer=null;
    
        public Axon(Layer inLayer, Layer outLayer){ 
    
        }
    
        public Reverse getReverseAxon()
        { 
            if (reverse==null) {
    			reverse=new Reverse(this);
    		}
    
            return reverse;
    
        }
    
        public boolean hasReverseAxon()
        { 
            return reverse!=null;
        }
    
    	//class Reverse
        public static class Reverse extends Axon {
    
            Axon forwardAxon;
    
            public Reverse(Axon fwdAx){
    
                super(fwdAx.postLayer,fwdAx.preLayer);
    
                forwardAxon=fwdAx;
            }
        }
    	.......
    }
    

    Quelltext für testAxon.h datei

    #ifndef SNN_TESTAXON_H 
    #define SNN_TESTAXON_H 
    
    class testReverse; // forward declaration 
    class testAxon {
    
    	public:
    		testAxon(...){};   
    		~testAxon(){};  
    
    		testReverse* getReverseAxon() {
    		    if (rev == nullptr) {
    			testAxon* ax;
    			rev = &testReverse(this);  // error C2440: '<function-style-cast>': 'snn::testAxon *const ' kann nicht in 'snn::testReverse' konvertiert werden	
    		    }
    		    return rev;
    		};
    
    	       bool hasReverse(){
    	          return rev != nullptr;
    	       };
    
    	       testReverse* rev;
    
    };	// end class
    
    #endif //SNN_TESTAXON_H 
    
    /////// test in main.cpp
    
    vector<testAxon*> axons;
    
    testAxon* addReverseAxon(testAxon* fwdAx){		
    	//check forwards axon has reverse axon or axons contains(fwdAx->reverse)
    	if (fwdAx->hasReverseAxon() && (find(axons.begin(), axons.end(), fwdAx->rev) != axons.end()) ){
    		cout << "Warning: Axon: has already been added.  Doing nothing.");
    		return fwdAx->getReverseAxon();
    	}
          testAxon* ax = fwdAx->getReverseAxon();
    	axons.add(ax);  
    
    	return ax;
    }
    ........
    

    Quelltext für testReverse.h datei

    #ifndef SNN_TESTREVERSE_H 
    #define SNN_TESTREVERSE_H 
    
    #include "testAxon.h"
    
    class testReverse : public testAxon {
    	public:
    		testAxon* forwardAxon_;
    
    		testReverse(){};   
    		testReverse(testAxon* fwdAx)  {
    			testAxon(...); 
    			forwardAxon_ = fwdAx;
    		};
    
    		~testReverse(){};
    
    };	// end class 
    
    #endif //SNN_TESTREVERSE_H
    


  • Tja, das ist wohl eine blöde Idee.

    Was an der Fehlermeldung überrascht dich.


  • Mod

    Übersetzung von technischen Details (Hier zum Beispiel: Wie genau die Ressourcenverwaltung gehandhabt wird.) ist eigentlich nie eine gute Idee. Dazu sind die beiden Sprachen zu verschieden. Du solltest dich lieber darauf beschränken, nur die Datenstrukturen¹ und Algorithmen zu übernehmen. Das ist es, worauf es ankommt. Tappe nicht in die Falle, C++ wie Java programmieren zu wollen (oder umgekehrt). Das funktioniert einfach nicht.

    ¹: Damit sind auch nicht die technischen Details gemeint. Also nicht, was ein Zeiger/Liste/Vector usw. ist, sondern allgemeine Betrachtungen zu den Klassen, die es gibt; welche Daten diese halten; welche Zuständigkeiten sie haben.



  • Hier:

    rev = &testReverse(this);
    

    Du hast testReverse nur als class deklariert. Dann kannst du das Ding nur als Pointer oder Referenz nutzen, nicht anders; insbesondere kannst du kein Objekt davon anlegen. Da der Compiler den Konstruktor nicht kennt, ist testReserve(x) also hier als Typecast erkannt worden: casten von this nach testReserve. Und das geht nicht.

    Außerdem scheinst du hier ein temporäres Objekt zu erstellen und davon die Referenz nehmen zu wollen. Das kann so sowieso nicht gehen.

    Und wenn du es den testReverse-Header includen würdest und rev=new testReserve(this) schreiben würdest, hättest du ein Speicherleck.


Log in to reply