Fehler, Irrtümer, Fragen - Seite 1057

 
Zloy_Koldun:

Die Brieftasche ist nur ein Sonderfall. Und niemand hindert sie daran, in den privaten Bereich zu gelangen.

In einem anderen Fall müssen Sie vielleicht auf die Variable der Elternklasse eines anderen Objekts zugreifen.

Und es liegt im Ermessen des Programmierers, ob er dies zulässt oder nicht. Und der Compiler muss sicherstellen, dass das Programm korrekt funktioniert.

Das ist der springende Punkt: Wenn dieser ganz andere Fall bei Ihnen eintritt, bedeutet das, dass Ihre Architektur konzeptionell falsch und potenziell gefährlich ist.

In C++ wurde das Konzept der so genannten freundlichen Klassen irgendwann auf unglückliche Weise eingeführt. Wenn eine Klasse weiß, wie eine andere Klasse organisiert ist, kann sie sicher mit deren internen Daten arbeiten. Die Praxis der Verwendung durch Tausende von Programmierern auf der ganzen Welt hat gezeigt, dass es eine gefährliche Sache ist, die mehr Probleme schafft, als sie zu lösen, so dass es in modernen Sprachen wie Java und C# aufgegeben wird.

 
C-4:
Diese Funktion war eine unangenehme Überraschung. Es ist definitiv Blödsinn, wenn der Compiler es erlaubt, das private Feld einer fremden Instanz zu ändern. Wir sollten es an den Service Desk weiterleiten.
Sie schauen auf die Pluspunkte, und so ist es auch dort.
 
Zloy_Koldun:

Ich verstehe nicht: Warum wollen Sie sich so sehr einschränken?

Glauben Sie, dass Ihr Programm dadurch automatisch sicherer wird?

Das wird es nicht! Im Gegenteil.

Es sind die unnötigen Einschränkungen, die Sie eines Tages dazu bringen werden, es so zu schreiben:

Sie wissen ein oder zwei Dinge über OOP, aber Sie verstehen es noch nicht.

Sehen Sie:

///
/// Класс - меценат. Любой желающий может взять из его кошелька сколько хочет.
/// Если у нас монополия на меценатов, и он может быть только один, объявляем класс статическим
/// (на его работу это никак не повлияет).
///
class Меценат
{
    public:
      /// Отдает нужное количество денег
      int GetMoney(int СколькоДенегВзять)
      {
          кошелек -= СколькоДенегВзять;
          return СколькоДенегВзять;
      }
    private:
       int кошелек;
};
Ist es verwunderlich, dass ich die Variable "Brieftasche" geschlossen habe, obwohl die ursprüngliche Idee der Klasse darin besteht, ihre Brieftasche für alle zugänglich zu machen? Aber wenn jeder so viel nimmt, wie er will, verlieren wir Geld, und das ist unmöglich. Die Funktion GetMoney erlaubt es jetzt, aber nachdem ich ein paar Zeilen hinzugefügt habe, kann ich kein Geld mehr abheben. Stellen Sie sich nun vor, dass die Klasse Maecenas von Dutzenden verschiedener Objekte angesprochen wird, die um Geld bitten. Wenn die Brieftaschenvariable geöffnet wird, müsste jedes dieser Objekte auch kontrollieren (d.h. eine eigene Implementierung haben), ob es genug Geld hat. Und wenn mindestens einer von ihnen dies nicht tut, riskiert er, einen negativen Wert anstelle von Null zu erhalten, was bedeuten würde, dass er um Geld gebeten hat und am Ende auch Geld schuldet.
 
C-4:

Kumpel, ich sehe, du weißt ein oder zwei Dinge über OOP, aber du hast noch nicht den Kern der Sache verstanden.

Sehen Sie:

Ist es verwunderlich, dass ich die Variable "Geldbörse" geschlossen habe, obwohl die ursprüngliche Idee der Klasse darin besteht, die Geldbörse für alle zugänglich zu machen? Aber wenn jeder so viel nimmt, wie er will, verlieren wir Geld, und das ist unmöglich. Die Funktion GetMoney erlaubt es jetzt, aber nachdem ich mehrere Zeilen hinzugefügt habe, kann ich kein Geld mehr abheben. Stellen Sie sich nun vor, dass die Klasse Maecenas von Dutzenden verschiedener Objekte angesprochen wird, die um Geld bitten. Wenn die Brieftaschenvariable geöffnet wird, müsste jedes dieser Objekte auch kontrollieren (d.h. eine eigene Implementierung haben), ob es genug Geld hat. Und wenn mindestens einer von ihnen dies nicht tut, besteht die Gefahr, dass er einen negativen Wert anstelle von Null erhält, was bedeuten würde, dass er um Geld gebeten hat und am Ende auch noch Geld schuldet.
Ich hatte nichts gegen eine private Brieftasche. Das Gespräch begann folgendermaßen:https://www.mql5.com/ru/forum/1111/page1072#comment_589657
 
Zloy_Koldun:
Ich hatte nichts gegen die private Brieftasche. Das Gespräch begann wie folgt:https://www.mql5.com/ru/forum/1111/page1072#comment_589657
Das ist richtig. Die Klasse B bezieht sich auf die externe Klasse A und möchte, dass geschützte Variablen der Klasse A für sie verfügbar sind. Wo ist hier die Logik, die ich nicht verstehe?
 
C-4:
Das ist richtig. Die Klasse B greift auf die externe Klasse A zu und möchte, dass geschützte Variablen der Klasse A für sie verfügbar sind. Ich verstehe die Logik hier nicht.
Es hat nichts mit Logik zu tun, es will...!
 
MetaDriver:
Was hat die Logik damit zu tun?

http://alenacpp.blogspot.com/2006/03/blog-post_11.html

Der geschützte Modifikator ist eine Hure. Selten wird sie wirklich benötigt.

Echte Verkapselung bedeutet Datenschutz.

Права доступа при наследовании
  • 2006.03.11
  • alenacpp.blogspot.com
С правами доступа при наследовании довольно легко запутаться. Мало того, что для данных и функций класса в С++ есть целых три уровня доступа: , и , еще ведь можно и само наследование сделать , и . Самым загадочным их них является -наследование. Запутаться во всем этом зоопарке очень просто, поэтому я аккуратно расписала где какой уровень досупа...
 
Können Sie mir sagen, ob Sie das erste Zeichen in pos auswählen wollen - soll ich 1 oder 0 in pos eingeben? Ist sie wie bei Arrays indiziert?
 
paladin800:
Können Sie mir sagen, ob Sie das erste Zeichen in pos auswählen wollen - soll ich 1 oder 0 in pos eingeben? Ist sie wie bei Arrays indiziert?
Dies ist leicht zu überprüfen: Drucken.
 
paladin800:
Können Sie mir sagen, ob Sie das erste Zeichen in pos auswählen wollen - soll ich 1 oder 0 in pos eingeben? Ist sie wie bei Arrays indiziert?
Ja, von Null an.