Anfänger Frage zu abstrakten Klassen



  • Hallo zusammen,

    bin recht neu mit C++ und Objektorientierung Allgemein. Ich stoße aktuell auf ein Problem das ich auch nach intensivem googeln nicht gelöst bekomme ich hoffe mir kann jemand weiterhelfen.

    Und zwar habe ich eine Abstrakte Klasse Neuron mit einer abstrakten Funktion GetValue();
    Von dieser Leite ich zwei Klassen ab einmal InputNeuron : public Neuron und einmal WorkingNeuron : public Neuron.
    Nun gibt es eine dritte Klasse Connections in der ich ein Objekt vom Typ InputNeuron oder Working Neuron speichern möchte.
    Nun habe ich aber das Problem das ich nicht eine Variable vom Typ Neuron anlegen kann um dann einen der beiden abgeleiteten Objekte zu speichern. Ich bekomme den Fehler das EntrieNeuron nicht vom Typ Neuron sein darf. (Siehe Code)

    ------------------------------------------------------------------------------------------------------------------------------------------------------
     #ifndef CONNECTION
    #define CONNECTION
    #include "Neuron.cpp"
    
    namespace NeuronalNetworks
    {
    
    class connection
    {
    
    public:
    	float weight;
    	Neuron EntrieNeuron;         // Hier ist scheinbar mein Fehler
    
    	connection(Neuron n, float weight)
    	{
    		this->weight = weight;
    		EntrieNeuron = n;
    	}
    
    	float GetValue()
    	{
    		return weight * EntrieNeuron.GetValue();
    	}
    
    };
    
    }
    #endif
    //#endif
    
    
    #ifndef NEURON
    #define NEURON
    #define _USE_MATH_DEFINES // for C++
    #include <math.h>
    
    using namespace std;
    
    
    namespace NeuronalNetworks
    {
    
    class Neuron{
    	public:
    
    	virtual float GetValue() = 0;
    	virtual ~Neuron(){};
    
    	static float Sigmoid(float x){
    		float et;
    
    		et = powf(M_E, x);
    		return et / (1 + et);
    
    	}
    
    
    
    
    };
    
    }
    #endif
    
    

    Ich hoffe mit diesen Infos ist es einigermaßen nachvollziehbar.

    Vielen Dank für jede Hilfe

    Gruß
    Stefan



  • Scheibe bitte ``` über und ``` unter Deinen Code. Oder markiere Deinen Code und klicke auf </>.



  • @swordfis erledigt



  • Du musst hier mit Zeigern arbeiten: Neuron*.



  • Für fortschrittlicheres C++ solltest du dir auch mal die Smart pointer anschauen.

    Außerdem:
    @cplusplus8 sagte in Anfänger Frage zu abstrakten Klassen:

    #ifndef CONNECTION
    #define CONNECTION
    #include "Neuron.cpp"
    

    Niemals Source-Dateien (.cpp) per #include einbinden.
    Ich nehme aber mal an, daß du die Datei einfach falsch benannt hast. Für Headerdateien nimmt man meistens ".h", ".hpp" oder ".hxx".



  • @manni66 Danke für den Tipp. Habe es jetzt angepasst und nun funktioniert die Übergabe des Objektes aber ich bekomme einen Fehler bei der virtuellen Funktion GetValue:
    Connection.cpp:27: error: request for member 'GetValue' in '((NeuronalNetworks::connection*)this)->NeuronalNetworks::connection::EntrieNeuron', which is of non-class type 'NeuronalNetworks::Neuron*'

    #ifndef CONNECTION
    #define CONNECTION
    #include "Neuron.h"
    //#include "InputNeuron.cpp"
    //#include "WorkingNeuron.cpp"
    
    
    
    namespace NeuronalNetworks
    {
    
    class connection
    {
    
    public:
    	float weight;
    	Neuron* EntrieNeuron;
    
    	connection(Neuron &n, float weight)
    	{
    		this->weight = weight;
    		this->EntrieNeuron = &n;
    	}
    
    	float GetValue()
    	{
    		return weight * EntrieNeuron.GetValue();      // Hier kommt der Fehler
    	}
    
    };
    
    }
    #endif
    

    Brauche ich hier auch einen Pointer oder ist der Fehler ganz anderer Art?



  • Bei Zeigern brauchst du -> (anstatt .), wie du es ja auch schon bei this->benutzt hast.

    Edit: Sehe jetzt erst, daß dein Konstruktor auch falsch ist. Auch bei den Parametern benötigst du Zeiger (denn es kann ja kein konkretes Objekt Neurongeben):

    connection(Neuron* n, float weight)
    {
    	this->weight = weight;
    	this->EntrieNeuron = n;
    }
    


  • Dir scheinen die Grundlagen zu fehlen. Das geht insbesondere mit Zeigern ganz schnell schief.



  • @th69 Klasse! Vielen Dank, es läuft jetzt und ich denke ich habe die Pointer Verwendung einigermaßen verstanden.
    Nun fehlt noch Übung 🙂