2017-02-09 6 views
2

Ich habe eine Klasse, die eine spezielle Nummer darstellt.Operator überladen Funktionen als Freund?

class SecretInteger 
{ 
private: 
    unsigned int *data; 
    size_t length; 

public: 
    SecretInteger operator+(const SecretInteger other) const; 
} 

ich keinen anderen Teil meines Codes haben Zugriff auf die data Variable zulassen. Jedoch muss meine operator+ Funktion es sehen können. Normalerweise weiß ich in diesem Fall, dass die Verwendung des Schlüsselworts friend der einzige Weg ist, dies zu tun. Allerdings, wenn ich schreibe:

friend SecretInteger operator+(const SecretInteger other); 

Sie macht geltend, dass die operator+ nicht als Freund deklariert werden, obwohl ich vorher friend std::ostream& operator<<(std::ostream& stream, const SecretInteger val); geschrieben habe und es funktioniert gut.

Welche Optionen habe ich für mich? Wenn ich eine öffentliche Methode wie

const *unsigned int getData() const; habe ich denke, selbst dann macht es nicht tatsächlich die Variable zurückgegeben const richtig? Ich würde wirklich lieber keine getData() Methode haben und stattdessen nur die Funktionen deklarieren, die Zugriff haben als friend.

+0

Sie deklarieren 'Operator +' als eine Member-Funktion, so dass es auf Daten zugreifen kann, nicht wahr? – songyuanyao

+0

~~ Es kann nicht auf 'andere' Daten zugreifen, die es mir unmöglich machen, arithmetisch zu arbeiten. ~~ – Hatefiend

+0

Randbemerkung: Auch wenn Sie auf einer Memberfunktion für die Überladung bestehen, gibt es keinen Grund, das Argument zu akzeptieren Wert. Sicherlich 'const SecretInteger & andere' ist, was Sie wollen. – ShadowRanger

Antwort

3

Sie haben nicht eine Memberfunktion als friend deklarieren, ist friend Nichtmitglied Funktionen Zugriff auf Interna zu geben und einen einen Operanden Überlastung von operator+ ist eine Memberfunktion.

In jedem Fall, wenn Sie die binären Operatoren ordnungsgemäß implementieren, sollten Sie überhaupt keine Freundschaft geben müssen. Implementieren Sie += als Member-Funktion (keine Notwendigkeit für friend, eine Klasse ist immer "Freunde" mit sich selbst), dann implementieren ein Nichtmitglied + Operator in Bezug auf +=, die += Zugriff auf die Interna verwendet, um das ganze Problem zu vermeiden der Freundschaft.

Die Grundregeln für die Überlastung can be found here und sollte viel helfen.

+0

Warten .... Warum hat mein Programm Zugang zu den Interna anderer Benutzer? In Java wäre dies nicht der Fall. Was ist denn hier los? In meinem 'operator +' kann ich auf private Mitglieder 'Daten' von' this' und 'other' zugreifen. Warum? – Hatefiend

+0

Ach ja, wenn Sie 'Klasse A' und irgendeine Funktion in' A' haben, die einen Parameter vom Typ 'A' aufnehmen, wird es privaten Zugriff auf diese Variable haben? – Hatefiend

+1

@HateFiend: [Java gibt Ihnen auch Zugang] (http://StackOverflow.com/a/29068196/364696). 'privat' bedeutet" nur für diese Klasse zugänglich ", so dass jeder' SecretInteger' auf die 'privaten' von' SecretInger' zugreifen kann, selbst oder eine andere Instanz.'privat' ist für Schnittstellenzwecke, es ist keine Sicherheitsfunktion für Firewall-Instanzen voneinander. – ShadowRanger