2017-05-17 2 views
0

mit Was die Notwendigkeit eines separaten Get- und Set-Funktion ist, wenn es möglich ist, sie zu kombinieren, wie folgt aus:Einstellen private Variablen einen Getter

class A { 
private: 
    int var = 0; 
public: 
    int& getset(){ return var; }; 
}; 

int main() 
{ 
    A a = A(); 
    a.getset() = 4; 
    std::cout << "Hello, " << a.getset() << "!\n"; 
} 

Ich gehe davon etwas gibt, das ich übersehen habe, aber im Falle das ist keine gute Idee; Warum ist es möglich, auf diese Weise auf private Mitglieder zuzugreifen?

+0

getset ?? Bitte benutzen Sie einen anderen Namen dafür .... –

+0

Ihr Getset bricht die Kapselung und gibt Ihnen Zugriff auf die private Member-Variable *** var *** –

+2

Weil es nicht offensichtlich ist (IMHO) und weil, wenn Sie etwas in der tun müssen Setzer kannst du nicht. Außerdem würde ich an dieser Stelle "var" öffentlich machen und damit fertig sein. –

Antwort

1

, wenn Sie nicht in irgendwelchen Kontrollen von Werten benötigen, als Sie class-struct und entfernen Sie unnötigen Verfahren ersetzen sollten:

struct A { 
    int var = 0; 
}; 

int main() 
{ 
    A a; 
    a.var = 4; 
    std::cout << "Hello, " << a.var << "!\n"; 
} 

Aber wenn Sie müssen in schwierigen Logik und einige Kontrollen von var, als Sie sollten separate Setter und Getter schreiben, nicht wie Ihre. getset() ist eine schreckliche Idee, mach es nicht noch einmal.

+0

Ich bin mir bewusst, dass es bessere Möglichkeiten gibt, mein Ergebnis zu erreichen, aber ich frage, warum es überhaupt möglich ist: In welchen Fällen wäre mein Beispiel nützlich? –

+2

Es ist möglich, auf Ihre Weise zu verwenden, aber es ist keine gute Übung: Dieser Code ist schwer zu lesen und zu verstehen, und schafft viele Möglichkeiten für Fehler in der Zukunft. Versuchen Sie, es zu vermeiden :) – knst

+2

@FrankVel "_why es ist sogar möglich_", weil der Versuch, es nicht möglich zu machen, würde (fast sicher) unnötigerweise die Sprache unnötig komplizieren (wenn es getan werden könnte, ohne "legitimen" Code zu brechen). "In welchen Fällen wäre mein Beispiel nützlich?" - wahrscheinlich keiner: Wenn aus irgendeinem obskuren Grund diese Art von Zugriff erforderlich wäre, wäre es einfacher und offensichtlicher, die zugrunde liegende Variable öffentlich zugänglich zu machen. Nicht alles, was möglich ist, muss (legitim) benutzt werden. – TripeHound

2

Es gibt keine Notwendigkeit für Getter und Setter überhaupt: einfach die Variable veröffentlichen.

class A { 
public: 
    int var = 0; 
}; 

Wenn Sie Implementierungsdetails ausblenden möchten, dann ist die Idee, dass der Getter const während der Setter nicht der Fall ist. Also müssen sie unterschiedliche Funktionen haben

class A{ 
public: 
    int getValue() const; 
    int setValue(int new_value); // returns old value 
private: 
    /* implementation details: Value may be encoded other than in a simple variable */ 
}; 
Verwandte Themen