ref struct als Rückgabewert?



  • Hallo, so langsam bin ich wiedermal am verzweifeln:

    ref class Ship{
    public:
    	ref struct st_akt_max{
    		int akt, max;
    		double prozent;
    	};
    private:
    	st_akt_max hp;
    public:
            Ship(void);
    	void set_hp(int akt, int max);		
    	void set_hp(int akt);				
    	st_akt_max get_hp(void);
    }
    

    So sieht meine Header Datei aus...
    So schön und gut... aber mit der get_hp Funktion hab ich noch so meine Probleme...

    Meine Quelltext-Datei dazu sieht wie folg aus:

    Ship::Ship(void){
    }
    
    // SET/GET # HP
    void Ship::set_hp(int akt, int max){ 
    	hp.akt = akt; 
    	hp.max = max; 
    	if(hp.max > 0){
    		hp.prozent = hp.akt/hp.max*100;
    	}
    }
    void Ship::set_hp(int akt){ 
    	hp.akt = akt;
    	if((int)hp.max > 0){
    		hp.prozent = hp.akt/hp.max*100;
    	}
    }
    Ship::st_akt_max Ship::get_hp(void){ return hp; }
    

    Und jetzt bekomme ich folgenden Fehler:

    error C2440: 'return': 'Ship::st_akt_max' kann nicht in 'Ship::st_akt_max' konvertiert werden.
    

    ... Ich habe schon versucht, meine ref struct st_akt_max außerhalb der Ship Klasse zu definieren (in dem Zuge hab ich dann das Ship:: vor st_akt_max in der Quelltextdatei weggelassen: Gleicher Fehler....)

    Ich hoffe ihr wisst Rat 😕 Denn ich wälze nun schon 1 Tag lang meine Bücher und Google und finde einfach nicht den Fehler...



  • Du könntest

    value struct
    

    bzw.

    value class
    

    verwenden. Oder aber deine Klasse so abändern:

    ref class Ship{
    public:
        ref struct st_akt_max{
            int akt, max;
            double prozent;
        };
    private:
        st_akt_max^ hp;
    public:
            Ship(void);
        void set_hp(int akt, int max);        
        void set_hp(int akt);                
        st_akt_max^ get_hp(void);
    };
    
    Ship::Ship(void){
        hp = gcnew st_akt_max();
    }
    
    // SET/GET # HP
    void Ship::set_hp(int akt, int max){ 
        hp.akt = akt; 
        hp.max = max; 
        if(hp.max > 0){
            hp.prozent = hp.akt/hp.max*100;
        }
    }
    void Ship::set_hp(int akt){ 
        hp.akt = akt;
        if((int)hp.max > 0){
            hp.prozent = hp.akt/hp.max*100;
        }
    }
    Ship::st_akt_max^ Ship::get_hp(void){ return hp; }
    

    Beachte das ^!
    Werde Dir über Reference vs Value Semantik in C++/CLI klar.

    Edit:
    BTW: C++/CLI ist selten eine gute Wahl für Applikationen. Nimm entweder C# oder C++. Dazu noch den folgenden Thread: http://www.c-plusplus.net/forum/263084



  • Danke 🙂 und ich bin auch schon am lesen, wieso das mit value struct so wunderbar klappt 😉

    zu dem BTW: Ich entwickle eine CLR Konsolen anwendung... Ich benutze dort viele Sachen von System:: (IO, Sockets (TcpClient), Threading)
    Ich habe schon erfolglos versucht, das ganze in einer Win32 Anwendung zu verpacken...

    (Ehrlich gesagt gefällt mir C++/CLI gar nicht... Aber ich hab keine Ahnung, wie ich das sonst umsetzen soll...)


Anmelden zum Antworten