Also hier ist, was ich weiß:Ist die Kapselung über öffentliche const Zeiger eine gute Idee?
- Es ist ratsam, nicht Ihre ivars direkt in Ihrem API aussetzen; Verwendung vielmehr Accessoren
- Ein
const
Zeiger auf ein nichtconst
Objekt einfach bedeutet, dass Sie das Objekt verändern können, aber nicht umgeleitet, wo der Zeiger
Hier ist meine Situation:
Ich habe ein paar verwandte Klassen. Ich möchte eine einfache Klasse erstellen, die über Zusammensetzung diese in einer logischen Schnittstelle kombiniert. Jede meiner eingeschlossenen Klassen hat bereits eine öffentliche und private Unterscheidung in ihrer API, so dass es mir nichts ausmacht, sie direkt den Benutzern meiner Elternklasse auszusetzen. Dies bedeutet, dass es für mich Overkill wäre, Accessoren für diese Ivars zu schreiben, da die Klassen bereits verwalten, was öffentlich ist und was nicht. Aber ich möchte nicht, dass Benutzer die tatsächlichen Objekte ändern, die in diese zusammengesetzte Elternklasse eingeschlossen sind.
So ist die einzige Art, wie ich denken kann, dies zu tun ist const
Zeiger auf diese Objekte zu verwenden, wie zum Beispiel:
class Parent{
public:
EnclosedClass1*const ec1; //users can enjoy the public API of EnclosedClass
EnclosedClass2*const ec2;
void convenienceMethod(){
//performs inter-related functions on both ec1 and ec2
}
}
Auf diese Weise gibt keinen Schaden jemand direkt mit der API von ec1
Schnittstelle in der Vermietung und ec2
aber ich möchte sicherstellen, dass dies ziemlich idiotensicher ist, dass zumindest diese Person nicht die tatsächliche Ressource manipulieren kann, daher die const
Zeiger.
Macht das Sinn, ist es eine gute Verwendung von const Zeigern?
Alternativ könnte ich sie private
komplett machen, vergessen Sie die Zeiger (diese Klasse verwaltet diese Objekte trotzdem), und nur die zusätzliche Arbeit zu schreiben, Accessoren für die öffentlichen Funktionen in diesen Objekten enthalten. Aber das scheint einfach übertrieben, oder?
"die zusätzliche Arbeit ... scheint nur wie Overkill, oder?" Nein, es scheint die passende Lösung zu sein. – Caleb
Es gibt einen Grund, warum andere Objekte dies nicht tun, und ein großer Teil davon besteht darin, die Schnittstelle von der Implementierung zu trennen. Ein Klassen Interna sind privat, so dass sie ändern können, ohne andere Teile der Anwendung zu brechen. – tadman
siehe [diese verwandte Frage] (http://stackoverflow.com/q/14932675/819272) – TemplateRex