Welches "Array" erstellen?
-
#include<algorithm>vorhanden? Da du nichtstd::findschreibst:using namespace stdoderusing std::findvorhanden?In deinem
vectorsindObst, du suchst aber anscheinend nach einemstd::string. Dafür muss einOperator==findbar sein, der einObstmit einemstd::Stringvergleicht. Ist das beabsichtigt? Falls dies nicht beabsichtigt ist und ein solche Operator nicht vorhanden ist, sähe die Fehlermeldung jedoch anders aus.
Vermutlich willst du wohl eher direkt nachobstsuchen, anstatt nachobst.getName().
-
Du hast recht, ich habe in diesem container voller Obst nach einem string gesucht und das geht ja sclislich nicht. Mein Ziel war es ursprünglich so ein array zu bilden
(Aus PHP)$Obst["banane"] $banane; //Banane ist ein Obejkt welches von Obst erbtedamit ich dann solche funktion wie
if(isset($obst["banane"]) { $obst["banane"]->eat(); }in c++ machen kann. Doch das funktioniert scheinbar nicht mit Vectoren...
Hast oder jemand anders einen vorschlag?
-
Ich glaube was du benötigst, ist ein assoziatives Array (bzw. Container).
std::map wäre hier wohl die beste Wahl.
Dein Code könnte dann in etwa so aussehen:
#include <map> std::map<std::string, Obst> meinContainer; void CommandMap::registerCommand(const Obst& obst) { auto iter = meinContainer.find(obst.getName()); if(iter == meinContainer.end()) { meinContainer.insert({obst.getName(), obst}); } } // Dann kannst du auch so darauf zugreifen: meinContainer["banane"].eat();
-
Singender Holzkübel schrieb:
Ich glaube was du benötigst, ist ein assoziatives Array (bzw. Container).
Singender Holzkuebel hat Recht aber so lange du keine alphabetische Sortierung benoetigst solltest Du eine hash map verwenden <unordered_map>.
Die outperformed die normale Map in allen belangen.
(Jedenfalls so lange der Key eine vernuenftige Laenge hat aber wer hat schon Keys mit ueber 150 Zeichen.)
-
Dankeschön Singender Rotzrübel
jedoch h#tte ich da noch eine frage bezühlich dieser zeile:auto iter = meinContainer.find(obst.getName());was macht das "auto"?
-
reba schrieb:
Dankeschön Singender Rotzrübel
jedoch h#tte ich da noch eine frage bezühlich dieser zeile:auto iter = meinContainer.find(obst.getName());was macht das "auto"?
Auto ist nur eine Abkuerzung fuer:
std::map<std::string,Obst>::iterator iter;
-
Oh anscheinend habe ich ein weiteres Problem.
Main Klasse bool isGood() { auto iter = meinContainer.find(name); return iter != meinContainer.end(); } Garten::Obst aufheben() { if(isGood(name)) { meinContainer[name].eat(); return true; } return false; }Wie der obrige Code zeigt will ich die funktion eat() aufrufen.
Dabei wird die Funktion eat() von der Obst klasse aufgerufen anstatt die von dem
(als beispiel) "apfel"Codes:
class Obst { public: Obst(); virtual void eat() { std::cout << "eat() wurde vom Obst aufgerufen"; } } class apfel : public Obst { public: apfel() : Obst() { //meine codes } virtual void eat() { std::cout << "eat() wurde vom Apfel aufgerufen"; } }Und ich möchte anstatt eat() von der Obst klasse, die eat() von der Apfel klasse aufrufe. Doch wie kann ich das machen?
-
Dann kannst du nicht Objekte in deienr Map halten, sodnern musst Zeiger oder Referenzen dort halten.
Aber das wird jetzt ganz schnell mal eben non-trivial...
-
Geht das wirklich nicht anderst
Ich würde das sehr gerne in dieser methode ausführen
-
Gehen tut 'ne ganze Menge. Was du aber zunächst mal verstehen musst, ist, dass C++ nicht PHP ist. Beispiel:
Apfel x = ...; Obst y = x;Hier sind x und y keine Referenzen, keine Zeiger oder was man dazu auch sonst in PHP sagen mag. x und y sind die Objekte selbst. Hier wird nur der Obst-Teil des Apfelobjekts x nach y kopiert, genauso wie bei
int x = 1729; int y = x;der Wert von x in y reinkopiert wird. Mit anderen Worten: In C++ sind Indirektionen nicht implizit für Klassentypen. Wenn du etwas Zeiger-artiges haben willst, nimm etwas Zeiger-artiges.
Dann kommt auch gleich das nächste Problem: Du weißt wahrscheinlich noch nichts von RAII, dem Ownership-Konzept und so weiter.
Du hast also viel Nachholbedarf! Erwarte nicht, dass du hier kostenlose Privatstunden bekommst. Also: Schnapp dir ein gutes, schlaues C++ Buch und lerne.
-
reba schrieb:
Geht das wirklich nicht anderst
Ich würde das sehr gerne in dieser methode ausführenSo zum Beispiel (ist ziemlich ähnlich, nur dass zeiger verwendet werden):
#include <memory> #include <unordered_map> #include <iostream> #include <string> using namespace std; struct Fruit { string name() const { return "Fruit"; } virtual void eat() const { cout << "eat() from fruit!\n"; } }; struct Apple : Fruit { string name() const { return "Apple"; } void eat() const override { cout << "eat() from apple!\n"; } }; struct Banana : Fruit { string name() const { return "Banana"; } void eat() const override { cout << "eat() from banana!\n"; } }; int main() { using FruitBox = unordered_map<string, unique_ptr<Fruit>>; auto fruit = make_unique<Fruit>(); auto apple = make_unique<Apple>(); auto banana = make_unique<Banana>(); FruitBox fruits; fruits[fruit->name()] = move(fruit); fruits[apple->name()] = move(apple); fruits[banana->name()] = move(banana); for (auto const &f : fruits) { f.second->eat(); } }