2013-03-31 7 views
11

Dies soll eine String-Klasse mit einer Reihe von Operatoren und Funktionen, einschließlich zwei Friend-Funktionen sein. Und diese beiden verursachen einige Probleme für mich, weil der Compiler sagt, dass sie nicht auf die privaten Mitglieder zugreifen können. Hier ist meine string.h:C++ - Friend-Funktion kann nicht auf private Mitglieder zugreifen

#include <iostream> 
#ifndef STR_H 
#define STR_H 

namespace MyStr 
{ 
class Str 
{ 
private: 
    unsigned int length; 
    char *data; 
public: 
    Str(); 
    Str(const Str&); 
    Str(const char*); 
    Str(char c, unsigned int db); 
    ~Str(); 
    char* cStr() const; 
    unsigned int getLength() const; 

viele irrevelant Funktionen hier ...

friend int operator/ (const Str&, char); 
    friend std::ostream& operator<< (std::ostream&, const Str&); 
}; 
} 
#endif /* STR_H */ 

hier ist der main.cpp:

#include <iostream> 
#include "Str.h" 

using namespace std; 
using namespace MyStr; 

ostream& operator<< (ostream& out,const Str& str) 
{ 
    for (int i=0; i<str.length; i++) 
    { 
     out<<str.data[i]; 
    } 
    out<<endl; 
    return out; 
} 

int operator/ (const Str& str, char c) 
{ 
    for (int i=0; i<str.length; i++) 
    { 
     if(str.data[i]==c) return i; 
    } 
    return -1; 
} 

Dieser Code wird nicht kompiliert, der Compiler behauptet, dass die Str Mitglieder privat sind.

+1

Welche Fehler bekommen Sie? – 0x499602D2

+0

Fehler: 'char * MyStr :: Str :: data' ist privat | Fehler: 'Unsigned Int MyStr :: Str :: Länge' ist privat | – spinakker

+0

In welcher Zeile gibt es diesen Fehler aus? Ist es für beide Funktionen? – 0x499602D2

Antwort

15

Sie sollten mehr auf Namespaces achten.

class Str { 
private: 
    unsigned int length; 
    char *data; 
public: 
    Str(){} 
    Str(const Str&){} 
    Str(const char*){} 
    Str(char c, unsigned int db){} 
    // maybe something more... 
    friend int operator/ (const Str&, char); 
    friend std::ostream& operator<< (std::ostream&, const Str&); 
}; 

ostream& operator<< (ostream& out,const Str& str) 
{ 
    for (int i=0; i<str.length; i++) 
     out<<str.data[i]; 
    out<<endl; 
    return out; 
} 

int operator/ (const Str& str, char c) 
{ 
    for (int i=0; i<str.length; i++) 
     if(str.data[i]==c) return i; 

    return -1; 
} 

int main() 
{ 
    Str s; 
    cout<<s; 
    return 0; 
} 

Sie erhalten Fehler wegen der unübertroffenen Namespaces. Wenn Sie lieber mit MyStr bleiben möchten, dann sollten Sie Namespace MyStr zu überladen Freund Betreiber hinzufügen. So können Sie das tun: (Operatoren sollten innerhalb des Namensraums definiert sein)

namespace MyStr { 
    ostream& operator<< (ostream& out,const Str& str) 
    { 
     for (int i=0; i<str.length; i++) 
     { 
      out<<str.data[i]; 
     } 
     out<<endl; 
     return out; 
    } 

    int operator/ (const Str& str, char c) 
    { 
     for (int i=0; i<str.length; i++) 
     { 
      if(str.data[i]==c) return i; 
     } 
     return -1; 
    } 
} 
7

Wenn Sie die Friend-Funktionen in Str deklarieren, werden sie als im umschließenden Namespace MyStr betrachtet.

Die Operatoren, die Sie definieren, befinden sich im globalen Namespace, daher glaubt der Compiler, dass dies zwei völlig verschiedene Operatoren sind und nicht die Freunde.

Sie können dies durch

namespace MyStr 
{ 

} 

in der CPP-Datei um die Betreiber des Hinzufügen lösen.

+0

Es hat funktioniert! Ich danke dir sehr. Ich muss lernen, wie man diese Namespaces verwendet ... – spinakker

+0

Ich versuche das und es funktioniert nicht - http://liveworkspace.org/code/4yc7Hy$3217 – 0x499602D2

+0

@David - Das ist anders. Sie versuchen, auf s.x' inside main zuzugreifen, und main ist kein Freund der Klasse. –