Variable ist Local zur Methode
-
Hallo,
ich habe das Problem das ich zwei Methoden habe eine Getter und eine Setter Methode, in der Setter Methode füge ich einem Vector einen Wert hinzu:void myClass::addConnection(Connection c) { connection.push_back(c); }
und in der Getter Methode gebe ich dann ein Wert aus diesem Vector zurück.:
float myClass::getValue() { for (Connection op : connection) { sum += op.getValue(); } return sum; }
Diese Variabeln sind ganz normal in der hpp datei initialisiert:
private: std::vector<Connection> connection; float sum = 0; public: void addConnection(Connection c); float getValue();
Das Problem das ich habe ist das wenn ich in der Set Methode etwas hinzufüge ich zwar in der Set Methode auf diese Werte zugreifen kann aber der Vector in der Get Methode Leer ist.
Genau das Gleiche habe ich auch mit einem Int und anderen Typen Probiert da habe ich aber das gleiche Ergebnis.
Wenn ich jetzt aber den Vector connection im Konstructor Manuel befühle kann die Get Methode auf die Werte im Vector zugreifen aber im Setter ist er wieder Leer.
-
Du zeigst nicht den echten Code. Außerdem ist er unvollständig.
OT :sum als Membervariable ist blödsinn. Benutze eine lokale Varible.
-
Das ist alles was ich in dieser Klasse habe oder willst du noch mal die anderen sehen?
-
Es fehlt
class ...
- die Definition von Connection
- eine main Funktion
Man kann den Code nicht kopieren und testen!
Der gezeigte Code sieht bezüglich des vectors korrekt aus, der Fehler liegt woanders.
-
...und zusätzlich ist die Frage, warum du Connection per value übergibst bzw. per "weder const noch ref"-Loop drüberläufst. Aber das hat mit deinem Problem erstmal nichts zu tun, sondern ist ein anderes (mögliches) Problem.
-
Ich habe das gesammte Projekt mal hochgeladen:
https://www.file-upload.net/download-13366531/nouronTest.rar.html
-
@Letus sagte in Variable ist Local zur Methode:
Ich habe das gesammte Projekt mal hochgeladen:
https://www.file-upload.net/download-13366531/nouronTest.rar.htmlNein danke.
Zeige hier ein minimales übersetzbares Beispiel, das den Fehler reproduziert.
-
@manni66 sagte in Variable ist Local zur Methode:
@Letus sagte in Variable ist Local zur Methode:
Ich habe das gesammte Projekt mal hochgeladen:
https://www.file-upload.net/download-13366531/nouronTest.rar.htmlNein danke.
Zeige hier ein minimales übersetzbares Beispiel, das den Fehler reproduziert.
OK ich probiere mein Bestes:
Zuerst die oben schon geposete Klasse://WorkingNouron.h #include <vector> #include "Connection.h" class WorkingNouron { private: std::vector<Connection> connection; float sum = 0; public: void addConnection(Connection c); float getValue(); };
//WorkingNouron.cpp #include "WorkingNouron.h" void WorkingNouron::addConnection(Connection c) { connection.push_back(c); } float WorkingNouron::getValue() { for (Connection op : connection) { sum += op.getValue(); } return sum; }
Die Klasse Connection:
//Connection.h #include "inputNeuron.h" class Connection { private: InputNeuron neuron; float weight; public: Connection(InputNeuron &mNeuron, float weight); float getValue(); }
//Connection.cpp #include "Connection.h" Connection::Connection(InputNeuron &mNeuron, float mWeight) : neuron(mNeuron), weight(mWeight) {} float Connection::getValue() { return neuron.getValue() * weight; }
Die in der Klasse Connection benötigte Klasse InputNeuron:
//inputNeuron.h class InputNeuron { private: float value = 0; public: void setValue(float mValue); float getValue(); };
//inputNeuron.cpp #include "inputNeuron.h" float InputNeuron::getValue() { return value; } void InputNeuron::setValue(float mValue) { value = mValue; }
Die Klasse NeuralNetwork in der alles zusammengetragen wird:
//NeuralNetwork.h #include <iostream> #include <vector> #include "inputNeuron.h" #include "Connection.h" #include "WorkingNouron.h" class NeuralNetwork { private: std::vector<InputNeuron> inputNeorun; std::vector<WorkingNouron> outputNeuron; public: InputNeuron createNewInput(); WorkingNouron createNewOutput(); void createFullMash(std::vector<float> weights); };
//NeuralNetwork.cpp #include "NeuralNetwork.h" InputNeuron NeuralNetwork::createNewInput() { InputNeuron in; inputNeorun.push_back(in); return in; } WorkingNouron NeuralNetwork::createNewOutput() { WorkingNouron wn; outputNeuron.push_back(wn); return wn; } void NeuralNetwork::createFullMash(std::vector<float> weights) { int index = 0; for (WorkingNouron wn : outputNeuron) { for (InputNeuron in : inputNeorun) { wn.addConnection(Connection(in, weights[index])); index++; } } }
und zuletzt die Main:
//main.cpp #include <iostream> #include "NeuralNetwork.h" int main() { NeuralNetwork nn; InputNeuron i1 = nn.createNewInput(); InputNeuron i2 = nn.createNewInput(); InputNeuron i3 = nn.createNewInput(); InputNeuron i4 = nn.createNewInput(); WorkingNouron o1 = nn.createNewOutput(); i1.setValue(1); i2.setValue(2); i3.setValue(3); i4.setValue(4); std::vector<float> weights = { 3, -1, 2, 0 }; nn.createFullMash(weights); std::cout << o1.getValue() << std::endl; system("PAUSE"); return 0; }
Das sind alle Klassen die benötigt werden um das Programm zu Compilieren.
-
Welchen Teil von minimal hast du nicht verstanden?
Da du dauernd Kopieen von allem erzeugst, würde ich mal da ansetzen.
-
Deine Fehler u.a. sind, daß bei
InputNeuron NeuralNetwork::createNewInput() { InputNeuron in; inputNeorun.push_back(in); return in; }
sowie
WorkingNouron NeuralNetwork::createNewOutput() { WorkingNouron wn; outputNeuron.push_back(wn); return wn; }
jeweils eine Kopie in den Vector gepackt wird (und von der
main
aus mit dem Original weitergearbeitet wird, welches unabhängig davon ist).
Du mußt also dein Design ändern...PS: Schreibfehler bei
std::vector<InputNeuron> inputNeorun;