Zugriff auf leeren Vector
-
Hi zusammen!
Ich habe wieder eine Frage:
Und zwar besitzt mein Programm verschiedene Objekte, welche wiederum z.b. verschiedene Vectoren enthalten.Nun kann sich der Anwender von einem Objekt diese Vectoren als Referenz übergeben lassen.
Es muss jedoch nicht sein dass diese Vectoren auch Elemente enthalten.Würde der Benutzer einfach auf einen solchen Vector zugreifen kommt es ja zu einem Fehler.
Bisher verlange ich von dem Anwender dass er zuerst eine Methode aufruft, welche einen bool zurück liefert, welche angibt ob der entsprechende Vector leer ist oder nicht.
Kann ich nicht einfach auch einen leeren (initialisierten Vector) zurück geben, worauf der Anwender dann checken muss, dass dieser nicht leer ist?
Dies hatte ich versucht, aber es ging leider nicht.
-
redbomber schrieb:
es ging leider nicht.
Dann ist ja klar, woran es liegt.
-
wie meinst denn das genau?
-
redbomber schrieb:
wie meinst denn das genau?
Du hast das Richtige versucht, dabei aber wohl etwas falsch gemacht. Was das war, kann man aber wegen der unzureichenden Fehlerbeschreibung "es ging leider nicht" nicht erkennen.
-
redbomber schrieb:
wie meinst denn das genau?
Das "genau" ist das entscheidene. Deine Angaben sind sowas von ungenau, das du darauf keine sinnvolle Antwort erwarten kannst. Oder was würdest du einem Kunden sagen wenn er als Fehler "Dies hatte ich versucht, aber es ging leider nicht." meldet?
Du kannst Vektoren zurückgeben. Deine Beschreibung lässt nur nicht eine sinnvolle Begründung was in deinen Fall falsch ist zu.
cu André
-
redbomber schrieb:
Dies hatte ich versucht, aber es ging leider nicht.
Wie meinst denn das genau?
Man kann doch VektorRef.empty() aufrufen?!
-
Ok, sorry, jetzt also etwas genauer
hier also mein mein Objekt von dem ich etwa die nodesInCluster oder/und die dirtyNodesInCluster haben möchte:
NodeCluster::NodeCluster() { existingCluster = true; // true if cluster is existing mean = 0.0; // median distance in this Cluster (computet by distance of node to his neighbors) variance = 0.0; // variance of this cluster sd = 0.0; // standardDeviation of this Cluster nodesInCluster = std::vector<int>(); dirtyNodesInCluster = std::vector<int>(); meanDistanceEachNode = std::map<int, double>(); } // Hier die Abfrage ob es überhaupt dirtyNodes gibt? bool NodeCluster::isDirtyNodeExisting(){ if(dirtyNodesInCluster.size() > 0) return true; else return false; } // hier bekommt der anwender den Vector mit den dirtyNodes std::vector<int>& NodeCluster::getDirtyNodesInCluster(void){ if(!dirtyNodesInCluster.empty()){ return dirtyNodesInCluster; } else { std::cerr << "NodeCluster::getDirtyNodesInCluster - no dirty nodes existing, always check first NodeCluster::isDirtyNodeExisting()" << std::endl; throw "Exception"; } }
Bisher muss der Anwender VOR dem Zugriff auf (zb. den dirtyNodesInCluster Vector) die Abfrage
nodecluster.isDirtyNodeExisting()
durchführen:
//NodeCluster nodecluster std::vector<int> dirtyNodes = std::vector<int>(); if(nodecluster.isDirtyNodeExisting()){ dirtyNodes = nodecluster.getDirtyNodesInCluster(); } if (!dirtyNodes.empty()) { for (int i = 0; i<dirtyNodes.size(); i++) { std::cout << "Node "<< dirtyNodes[i]<< " is dirty"<< std::endl; } } else { std::cout << "No dirty node existing for this cluster" << std::endl; }
Ich weiss nicht ob es zuviel verlangt ist von dem Anwender diese Abfrage vorab zu verlangen. Wenn er est nicht macht, schmeisst mein Programm einen Fehler.
Ich würde es hingegen besser finden, dass er einfach einen leeren Vector erhält (falls keine dirtyNodes vorhanden sind) und er dann selbst checken muss ob der Vector leer ist.
Oder was meint ihr?
-
redbomber schrieb:
Ich würde es hingegen besser finden, dass er einfach einen leeren Vector erhält (falls keine dirtyNodes vorhanden sind) und er dann selbst checken muss ob der Vector leer ist.
Ja, klingt toll, mach das doch. Und zeig endlich, was da "nicht geht".
-
Wenn dein Vektor keine Elemente hat und du eine Referenz auf diesen Vektor (std::vector<T>&) zurückgibst, dann zeigt die Referenz immernoch auf einen Vektor der keine Elemente enthält... Ich verstehe dein Problem irgendwie nicht.
Außerdem setzt du den Inhalt der Vektoren im Konstruktor neu. Allerdings sind im Funktionsrumpf des Konstruktors längst alle Membervariablen konstruiert, d.h. bevor dein Konstruktor aufgerufen wird, wurde bereits der Defaultkonstruktor für all deine Vektoren aufgerufen (der einfach einen leeren Vektor initialisiert). Wenn du etwas anderes als den leeren Vektor initialisieren willst, dann musst du das in der Initialisierungsliste des Konstruktors machen. Was du da machst, ist auf jeden Fall, einen leeren Vektor mit einem leeren Vektor "überschreieben".Btw, kommst du zufällig aus der Java-Welt?
Viele Grüße,
Michael
-
Hi,
ja ich komme aus der Java-WeltUnd jetzt habe ich auch mein Problem lösen können, bzw. das Problem existiert nicht mehr.
D.h. so wie ihr es gesagt habt, gibt es da kein Problem mehr.
Der Anwender bekommt einfach einen leeren Array übergeben und muss sich sleber darum kümmern die Größe zu checken.Also das Problem ist somit gelöst,
vielen Dank euch allen!
-
Dann denk daran, dass in C++ nicht alles ein Referenztyp ist, wie in Java...
-
ja, damit hatte ich auch schon lange zu kämpfen
vielen Dank!