frage zu variablen in Klassen, die nur von "aussen" verändert werdne können



  • kurze Frage: hat irgendjemand eine idee, wie ich das machen könnte? ich will sichergehen, daß niemand an den Variablen innerhalb der Klasse rumspielt, da der Wert von aussen ständig aktualisier wird. sich innerhalb der Klasse aber nicht ändern darf.



  • kurze nachfrage: WTF?

    das geht natürlich nicht. warum sollte das überhaupt verhindert werden müssen, du hast doch die vollständige kontrolle über die implementierung deiner klasse? wenn die variablen nicht angefasst werden sollen, dann lass sie doch einfach in ruhe.
    wenn ein anderer programmierer deinen source ändert und die variablen doch überschreibt, kannst du das sowieso nicht verhindern.

    du kannst den zugriff prinzipiell nur selektiv lockern (friend), aber nicht einschränken. du könntest allerdings auch dem c++-komittee das neue keyword "foe" vorschlagen.



  • möglicherweise willst du so etwas in der art:

    class owns_values
    {
        friend class changes_values;
    private :
        int value;
    };
    
    class changes_values
    {
        owns_values m_values;
        void foo()
        {
            m_values.value = 4;
        }
    };
    

    das unterbindet natürlich nicht, dass owns_values seine eigenen member ändert. was übrigens zu der erheiternden situation führen würde, dass die klasse ihre eigenen member nicht initialisieren dürfte.



  • yeus schrieb:

    kurze Frage: hat irgendjemand eine idee, wie ich das machen könnte? ich will sichergehen, daß niemand an den Variablen innerhalb der Klasse rumspielt, da der Wert von aussen ständig aktualisier wird. sich innerhalb der Klasse aber nicht ändern darf.

    😕
    Ich vermute, Du brauchst einfach eine Kopie:

    struct A {
       string intS;
       void setS(string const& parm) { intS = parm; }
       void MachWasMit_S();
    }
    
    int main() {
       string extS = "mein String der nicht von A veaendert werden soll";
       A a;
       a.setS(extS);
       a.MachWasMit_S();
       ext += "Wichtig, dass a es nicht verändert hat";
    ...
    

    Erfüllt genau Deine o.g. Forderungen...
    Falls A selbst dem Parameter gar nicht verändern, sondern nur ab&an mal auslesen möchte, reicht ihm statt einer Kopie (string intS;) auch eine const-Referenz (string const& intS;). Allerdings muss man dabei "Scope-Probleme " beachten...

    Gruß,

    Simon2.



  • yeus schrieb:

    kurze Frage: hat irgendjemand eine idee, wie ich das machen könnte? ich will sichergehen, daß niemand an den Variablen innerhalb der Klasse rumspielt, da der Wert von aussen ständig aktualisier wird. sich innerhalb der Klasse aber nicht ändern darf.

    willst du vielleicht dass alle Objekte der Klasse gemeinsam die gleichen Daten von außen benützen?

    es gibt doch noch diese statische Datenelemente damit man nicht jedes mal beim Erzeugen eines Objektes die Werte von außen rüberkopiert werden müssen.



  • hmm. vielleicht sollte ich noch ein bischen näher auf meine Gründe eingehen, sonst sieht meine Frage schon reichlich komisch, aus, das muss ich zugeben :).

    Mein Problem ist folgendes: ich hab eine Art Simulation, in der eine Menge dynamische Objekte existieren, die in einer pyramidenförmigen Hirarchie eingebunden sind...

    in jeder Zeitschleife wird jetzt das Objekt an der Spitze der Pyramide aktualisiert das erechnet einige Werte und gibt diese an die Child-Objekte weiter. die erechnen widerum einige Werte und geben sie weiter an ihre Child-Objekte.

    Nachdem die ganze Pyramide von oben nach unten durchlaufne wurde, berechnen jetzt die Objekte der unteresten Hirarchie mit den von oben heruntergegeben Werten wieder neue Werte und die werden von den parent-objekten wieder durch die gesamt Hirarchie bis zur Spitze gefiltert und durchgereicht. und damit ist ein zeitschritt vollzogen.

    Das Problem ist jetzt: es ist extrem wichtig, daß man innerhalb der jeweiligen Klassen nicht an denjenigen Werten herumspielt, die jeweils von der parent-Klasse überreicht wurden, da der Zeitpunkt, an dem diese berechnet werden (im Prinzip ist dieser zeitpunkt durch die Stelle in der Pyramide, an der das Parent-object steht festgelegt), für die Simulation sehr wichtig ist. und diesen Zeitpunkt kann nur das jeweilige Parent-objekt genau wissen.

    Aber die Lösung von Simon2 mit

    string const& intS
    

    sieht gut aus... ich glaube das ist das, was ich suche... Aber ich bin natürlich voll in die Scope-Probleme bei der Initialisierung geraten...

    Vielleicht fällt einem ja noch etwas weniger "Fehlerunanfälligeres" ein :)? durch meine Pyramiden-Hirarchie hab ich zum glück weniger probleme beim durchlaufen der zeitschritte, da das alles über rekursive methoden läuft.
    Allerdings andere Programmierer könnten Probleme kriegen, wenn sie von meiner Klasse vererben...



  • yeus schrieb:

    ...
    Aber die Lösung von Simon2 mit

    string const& intS
    

    sieht gut aus... ich glaube das ist das, was ich suche... Aber ich bin natürlich voll in die Scope-Probleme bei der Initialisierung geraten...

    Nicht selten sind Scope-Probleme in Wirklichkeit fachliche Probleme mit der Lebensdauer - sprich: Man hat sich nicht genug überlegt, wer wann welches Objekt erzeugt, bearbeitet und vernichtet. Du solltest mal sehen, ob das nicht bei Dir der Fall ist; nicht nur, um dann evtl. doch die "const&"-Variante anzuwenden, sondern vor Allem, weil sich sonst aus dieser Konzeptschwäche ein Haufen anderer Probleme ergeben können/werden.

    Ansonsten kannst Du natürlich auch einen const* (besser: Ein entsprechendes smart_pointer-Konstrukt) nehmen; den kannst Du unabhängig von der Lebensdauer des umgebenden Objektes zuweisen. Allerdings muss Deine umgebende Klasse natürlich zu jedem Zeitpunkt in der Lage sein, mit ungültigen Objekten (z.B. 0-Pointer) umzugehen.

    Gruß,

    Simon2.


Log in to reply