In std::sort Funktor auf andere Klassen zugreifen?



  • Ok, also ich habs jetzt so probiert und der Compiler meckert von wegen Verwendung des undefinierten Typs "MoneyBag", wohl wegen der Vorwärtsdeklaration. Dabei verwende ich doch schon einen Pointer in der Sortier-Methode?

    class Money
    {
    public:
    	int value;
    	Money(int value_) : value(value_) {};
    };
    
    class MoneyBag;
    
    struct MoneyComparator
    {
    	MoneyComparator(MoneyBag *container_) : container(container_) {};
    	bool operator()(Money const &first, Money const &second) const
    	{
    		return first.value + container->random_money() < second.value + container->random_money();
    	}
    	MoneyBag *container;
    };
    
    class MoneyBag
    {
    public:
    	MoneyBag(std::vector<Money> much_money_) : much_money(much_money_) {};
    	void sort_money() { std::sort(much_money.begin(), much_money.end(), MoneyComparator(this)); };
    	std::vector<Money> much_money;
    
    	int random_money() { return 1; }; // Vereinfacht
    };
    


  • Hilft es, die Definition von bool MoneyComparator::operator()() unter die Definition von class MoneyBag{} zu ziehen?



  • Tasächlich, damit klappt es dann 👍

    Auch wenn ich nicht verstehe warum... die Methode ist doch jetzt unter allen anderen Deklariert, wie das helfen kann kapier ich nicht



  • happystudent schrieb:

    ... die Methode ist doch jetzt unter allen anderen Deklariert

    Definiert

    Sie benutzt die Methode MoneyBag::random_money() , und die war an der alten Stelle noch nicht bekannt(nur eine Forwärtsdeklaration von class MoneyBag , keine Details)


  • Mod

    Wie wäre es einfach mit einem Lambda?



  • Erzähl mal was das für einen Sinn machen soll also der Use Case 😃 Muss ja was völlig verquertes sein



  • Wenn random_money einen zufälligen Wert zurückgeben sollte ist das btw. nicht erlaubt es im Comparotor-Objekt zu verwenden da es dann keine Ordnungsrelation mehr ist.



  • Ethon schrieb:

    Wenn random_money einen zufälligen Wert zurückgeben sollte ist das btw. nicht erlaubt es im Comparotor-Objekt zu verwenden da es dann keine Ordnungsrelation mehr ist.

    Ja das stimmt, war jetzt nicht das beste Beispiel mit dem random Wert. In echt wird hier kein random Wert verwendet, sondern ein deterministischer, mir ist nur für das Minimal-Beispiel nichts besseres eingefallen 😃

    ......, schrieb:

    Erzähl mal was das für einen Sinn machen soll also der Use Case 😃 Muss ja was völlig verquertes sein

    Ist für ein physikalisches System, dessen interne Zustände sortiert werden müssen... Money ist in Wirklichkeit sowas wie PhysicalState und Moneybag ist PhysicalSystem . Die States werden aber durch Veränderung ihrer Reihenfolge auch durch das PhysicalSystem beeinflusst, daher will ich in der Sortiermethode auf Methoden von PhysicalSystem zugreifen können.

    Arcoth schrieb:

    Wie wäre es einfach mit einem Lambda?

    Hm, aber wie soll ich das in den operator() reinkriegen? Die std::sort Funktion braucht ja einen operator() der genau zwei Typen der zu vergleichenden Objekte nimmt?

    Caligulaminus schrieb:

    Definiert

    Sie benutzt die Methode MoneyBag::random_money() , und die war an der alten Stelle noch nicht bekannt(nur eine Forwärtsdeklaration von class MoneyBag , keine Details)

    Hm Ok. Das ist schon sehr nervig muss ich sagen, aber gut. Kann man nicht irgendwie nur die Methode MoneyBag::random_money() vorwärts-deklarieren?



  • happystudent schrieb:

    Arcoth schrieb:

    Wie wäre es einfach mit einem Lambda?

    Hm, aber wie soll ich das in den operator() reinkriegen? Die std::sort Funktion braucht ja einen operator() der genau zwei Typen der zu vergleichenden Objekte nimmt?

    Einfach hinschreiben. Lambdas sind genau für sowas da.

    MoneyBag mb;
    std::sort(much_money.begin(), much_money.end(), [&](const Money &lhs, const Money &rhs){return mb.compare(lhs.value, rhs.value);} };
    


  • Hm, das ist natürlich nicht schlecht... werd ich gleich mal ausprobieren, danke 👍


Anmelden zum Antworten