L-Value / R-Value



  • hi,

    gibt es eine Möglichkeit, einen Funktionsparameter auch aus einer = Zuweisung zu erhalten ?

    statt:

    variable.set("a",2.3);
    

    möchte ich sowas machen können:

    variable.set("a")=2.3;
    

    grüße aus Peine Mirko


  • Mod

    Nicht, wenn du den Wert (hier 2.3) in der Funktion benutzen möchtest. Warum sollte man so etwas wollen? Benutz die Sprache so, wie sie gedacht ist.



  • class int_
    {
    private:
        int _int;
    
    public:
        int get() const
        {
            return _int;
        }
    
        int& set()
        {
            return _int;
        }
    };
    
    int main()
    {
        int_ foo;
        foo.set() = 12;
    }
    

    Mit ner Referenz. Aber nicht gerade eine schöne Sache.



  • SeppJ schrieb:

    Nicht, wenn du den Wert (hier 2.3) in der Funktion benutzen möchtest. Warum sollte man so etwas wollen? Benutz die Sprache so, wie sie gedacht ist.

    Ist doch übersichtlicher mit der = Zuweisung. Da weis jeder der den Code sieht was geschehen soll.
    Ich möchte "a" den Wert 2.3 zuweisen.



  • Weniger unschön, wenn man es get statt set nennt. Denn durch den Aufruf der Methode wird noch nichts gesetzt -> set als Name ist somit unlogisch.



  • operator[]



  • Ethon schrieb:

    class int_
    {
    private:
        int _int;
    
    public:
        int get() const
        {
            return _int;
        }
    
        int& set()
        {
            return _int;
        }
    };
    
    int main()
    {
        int_ foo;
        foo.set() = 12;
    }
    

    Mit ner Referenz. Aber nicht gerade eine schöne Sache.

    So komme ich aber nicht in der Funktion set an die 12 ?



  • offensiv schrieb:

    Ich möchte "a" den Wert 2.3 zuweisen.

    Ganz genau, das willst du, tust es aber nicht. Deine Funktion heißt set , du übergibst ihr aber kein Wert. Wie will man etwas setzen ohne etwas zu haben? Da denkt man sich nur, WTF.



  • Wenn du nur was mit = setzen willst, warum nimmt du nicht einfach eine public membervariabel?



  • Sofern Ihr Euch einer Karte im Geiste besinnet, anbei mit Abbildung von Schlüsseln zu Werten, so weise ich demütig auf die vom Kellerautomaten überbrachte Kunde hin, selbst wenn mich der Name von letzterem stark nach Hexenwerk dünkt.

    Es ziehet von dannen,
    Der Alchimist



  • hier mal alles ...

    #include <iostream>
    #include <stdexcept>
    
    using namespace std;
    
    template<typename T1, typename T2> class cVar
    {
        private:
            static const int ARR_MAX=99;
            T1 _v1[ARR_MAX];
            T2 _v2[ARR_MAX];
            int _index;
    
        public:
    
            cVar():_index{0}
            {
    
            }
    
            void add(T1 v1,T2 v2)
            {
                if (_index>=ARR_MAX) throw logic_error("array zu klein.");
                _v1[_index] = v1;
                _v2[_index] = v2;
                _index++;
            }
    
            T2 get(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
    
                throw logic_error("'" +v1+ "' nicht gefunden.");
            }
    
            void set(T1 v1,T2 v2)
            {
                for (int i=0;i<_index;i++)
                {
                    if ( _v1[i]==v1 ) _v2[i]=v2;
                    return;
                }
    
                throw logic_error("'" +v1+ "' nicht gefunden.");
    
            }
    
            T2& set2(T1 v1)
            {
                return _v2[0];
            }
    
    };
    
    int main()
    {
    
        cVar<string,double> nvars;
        nvars.add("a");
        nvars.add("b",1.2);
    
        nvars.set("a",2.3);
    
        // todo: sowas wäre schön
        // nvars.set2("a")=2.3;
    
    }
    


  • T2& get(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
    
                throw logic_error("'" +v1+ "' nicht gefunden.");
            } 
    
    ...
    
    nvars.get("a")=2.3;
    


  • Schau dir mal an, wie die std::map aufgebaut ist.



  • otze_logout schrieb:

    T2& get(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
    
                throw logic_error("'" +v1+ "' nicht gefunden.");
            } 
    
    ...
    
    nvars.get("a")=2.3;
    

    compiliert er zwar, aber ich möchte ja die 2.3 meinem array von T2 zuweisen



  • mappppppppppp schrieb:

    Schau dir mal an, wie die std::map aufgebaut ist.

    ja kenne ich. statt ["a"]=2.3 möchte ich aber foo("a")=2.3



  • offensiv schrieb:

    ja kenne ich. statt ["a"]=2.3 möchte ich aber foo("a")=2.3

    Ändert ja nichts am grundlegenden Prinzip. Beides sind Memberfunktionen.

    <💡>



  • template<typename T1, typename T2> class cVar
    {
        private:
            static const int ARR_MAX=99;
            T1 _v1[ARR_MAX];
            T2 _v2[ARR_MAX];
            int _index;
    
        public:
            cVar() : _index(0)
            {
            }
    
            void add(T1 v1,T2 v2)
            {
                if (_index>=ARR_MAX) throw logic_error("array zu klein.");
                _v1[_index] = v1;
                _v2[_index] = v2;
                _index++;
            }
    
    		T2 get(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
                throw logic_error("'" +v1+ "' nicht gefunden.");
            }
    
            T2& set(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
                throw logic_error("'" +v1+ "' nicht gefunden.");
            }
    };
    
    int main()
    {
        cVar<string,double> nvars;
        nvars.add("b",1.2);
    	nvars.set("b")=2.3;
    	cout << endl << nvars.get("b");
    }
    


  • offensiv schrieb:

    compiliert er zwar, aber ich möchte ja die 2.3 meinem array von T2 zuweisen

    tu ich doch. Am Ende steht an der Position für die _v1[i]=="a" gilt, dass _v2[i]=2.3



  • otze_logout schrieb:

    offensiv schrieb:

    compiliert er zwar, aber ich möchte ja die 2.3 meinem array von T2 zuweisen

    tu ich doch. Am Ende steht an der Position für die _v1[i]=="a" gilt, dass _v2[i]=2.3

    Er ist verwirrt, weil da get und nicht set steht.



  • out schrieb:

    template<typename T1, typename T2> class cVar
    {
        private:
            static const int ARR_MAX=99;
            T1 _v1[ARR_MAX];
            T2 _v2[ARR_MAX];
            int _index;
    
        public:
            cVar() : _index(0)
            {
            }
    
            void add(T1 v1,T2 v2)
            {
                if (_index>=ARR_MAX) throw logic_error("array zu klein.");
                _v1[_index] = v1;
                _v2[_index] = v2;
                _index++;
            }
    
    		T2 get(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
                throw logic_error("'" +v1+ "' nicht gefunden.");
            }
    
            T2& set(T1 v1)
            {
                for (int i=0;i<_index;i++)
                    if ( _v1[i]==v1 ) return _v2[i];
                throw logic_error("'" +v1+ "' nicht gefunden.");
            }
    };
    
    int main()
    {
        cVar<string,double> nvars;
        nvars.add("b",1.2);
    	nvars.set("b")=2.3;
    	cout << endl << nvars.get("b");
    }
    

    ja so gehts. Ist mir blos noch nicht klar wieso 😞


Log in to reply