C++ - Zugriff auf private Mitglieder der Klasse von ausserhalb der Klasse
Ich würde gerne wissen, ob es irgendeine Möglichkeit zum Zugriff auf private member einer Klasse außerhalb der Klasse. Ich erkläre mein problem.
Habe ich eine .hpp diese Datei enthält die definition der Klasse zusammen mit der privaten Mitglieder und der öffentlichen Funktion (das sind die einzigen, die ich exportieren möchten). In der übereinstimmung .cpp habe ich einige "support" - Funktion, die Notwendigkeit, Zugriff auf die privaten member der Klasse definiert .hpp.
Hier ist ein Teil von meinem code:
--- .hpp - - - -
namespace vision {
class CameraAcquisition {
/* MEMBERS */
CvSize size;
CvCapture *device;
CvScalar hsv_min,hsv_min2,hsv_max,hsv_max2;
/* METHODS */
public:
CameraAcquisition();
~CameraAcquisition();
int findBall();
};
}
--- .cpp ---
#include "CameraAcquisition.hpp"
using namespace vision;
IplImage *grabFrame() {
//code here
}
IplImage *convertToHSV(IplImage *origin) {
//code here
}
IplImage *calculateThresholdedImage(IplImage *converted) {
//code here
}
Was ich brauche, ist für diese drei Funktionen zum Zugriff auf die Elemente der Klasse CameraAcquisition. Gibt es eine Möglichkeit, es zu tun? Anregungen werden geschätzt. Danke Euch allen
BEARBEITEN
Sorry, ich vergaß ein wichtiges Stück von Informationen hier. In der Quell-Datei, findBall() aufrufen muss, diese Methoden. Ich definiert diejenigen Methoden, um den code leichter zu Lesen. Ich kann nicht erklären, diese Methoden in der definition der Klasse, weil ich nicht wollen, zu exportieren.
Wenn ich erkläre Ihnen in einem "privaten" block funktioniert alles einwandfrei, aber vielleicht ist es nicht richtig, dass (ich sehe nicht den Sinn, die eine header-Datei mit private-Methoden.
- Können Sie ändern Sie die header-Dateien eingebunden? Wenn Sie & es existiert eine starke Kopplung zwischen den beiden Klassen dann können Sie
friend
Schiff,Beachten Sie, dassfriend
Schiff verbessert die Kapselung in diesem Fall eher als zu brechen es, wie einige vorschlagen & es ist weit besser, eine option als Kapselung brechen getter -, setter-Methoden oder gefährliche Hack mit Makros.Nur nicht entscheiden sich für diejenigen,schreiben Sie code, der lesbar ist und wartbar statt komische Sachen, die niemand außer dir verstehen kann/Pflege in der Zukunft. - mögliche Duplikate von Zugriff auf private member verwenden Vorlage trick
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn diese Mitglieder sind aus
private
und Sie müssen Zugang zu Ihnen, machen Sie etwas falsch, so mein Vorschlag ist, dass Sie nicht.Nun mal ernst - es gibt einige Möglichkeiten - DISCLAIMER: nicht alle sind sicher oder portablen oder garantiert, um zu arbeiten:
1) Präprozessor Missbrauch
2) Fake Klasse
3) Vorlage Missbrauch geschrieben von litb - http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html
Dieser ist in der Tat überraschend, standard-konform.
Sollten Sie nicht möchten, um Zugriff auf vertrauliche gegenwärtigen Mitglieder der Objekte. Halte die öffentliche getter/setter-member-Funktionen, die außerhalb von code verwenden können, um die Auswirkungen auf die privaten member-Variablen
Alternativ können Sie Ihre support-Funktion ein Mitglied der Klasse, so hat er automatisch Zugriff auf private Mitglieder.
Wenn Sie wirklich will Zugriff auf private Mitglieder, die Sie verwenden können, die
friend
Schlüsselwort zum deklarieren einer anderen Klasse oder Funktion als friend der aktuellen KlasseHier beide Klasse
B
(d.h. deren member-Funktionen) und Kostenlose Funktionf
zugreifen könnenA::a
friend
ich bin mir sicher, er konnte die Mitgliederpublic
.friend
sprivate
Mitglieder in der definition einer Klasse ist völlig normal. Wenn Sie wollten, ausblenden die tatsächliche Umsetzung, suchen Sie sich das PIMPL-idiom (Private Durchführung-im Grunde ou haben eine vorwärts-deklarierte struct enthält alle privaten Implementierungsdetails und die Klasse hält (private) Zeiger auf das struct; die eigentliche definition der stuct ist in der entsprechenden Umsetzung .cpp)Verwenden Sie get-in Ihrem CameraAcquisition Klasse
d.h.
CVSize getSize() { return size; }
CvCapture* getDevice { return device; }
etc...
Konnte man immer erklären, Sie als Freunde hinzufügen, die in der definition der Klasse:
Compiler ist Visual Studio 2015
Diese Methode wird nicht empfohlen, aber funktioniert.
Betrachten wir folgende Klasse
Nur die Daten der Mitglieder gespeichert sind, die in der Klasse object.
Jetzt kann ich den Zugriff auf die
x
mit der folgenden Funktion.Ich weiß, dass
class mydata
hat nur eine variable, es muss dieint x
.Wenn es eine andere variable, sagen wir
y
TypDATATYPE
.Nun, um Zugriff auf y wir berechnen den offset von der Basis des Objekt -.
In der Regel werden die Daten in der gleichen Reihenfolge, in der Sie deklariert werden.
Auch ist die Struktur, die Polsterung ist als im Falle der heterogenen Datentypen in der Klasse.
Ich möchte empfehlen, Sie zu Lesen struct padding in die Tiefe.
... Und die bekommen wir y als