2013-03-31 187 views
11

這應該是一個字符串類,有很多操作符和函數,包括兩個朋友函數。而這兩者對我造成一些麻煩,因爲編譯器說他們無法訪問私有成員。這裏是我的文件string.h:C++的朋友函數不能訪問私人成員

#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; 

很多在這裏irrevelant功能...

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

這裏是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; 
} 

此代碼不能編譯,編譯器聲稱Str成員是私人的。

+1

你會得到什麼錯誤? – 0x499602D2

+0

錯誤:'char * MyStr :: Str :: data'是private | 錯誤:'unsigned int MyStr :: Str :: length'是private | – spinakker

+0

在哪一行發出錯誤?這是兩個功能嗎? – 0x499602D2

回答

15

您應該更加註意命名空間。

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; 
} 

由於不匹配的命名空間,您會收到錯誤。如果您更願意堅持使用MyStr,那麼您應該將名稱空間MyStr添加到超載朋友運營商。這是你如何做到的:(運營商應該在命名空間內定義MyStr

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

當您在Str中聲明好友函數時,它們被視爲位於即時封閉名稱空間MyStr中。

您定義的運營商都在全局命名空間,所以編譯器認爲,這是兩個完全不同的運營商,而不是朋友。

您可以通過在.cpp文件中添加

namespace MyStr 
{ 

} 

各地運營商解決這個問題。

+0

它的工作!非常感謝。我必須學習如何使用這些命名空間... – spinakker

+0

我正在嘗試這個,它不工作 - http://liveworkspace.org/code/4yc7Hy$3217 – 0x499602D2

+0

@David - 這是不同的。你嘗試訪問主內部的's.x',而main不是這個類的朋友。 –

相關問題