2013-03-31 2 views
11

これは2つのフレンド関数を含む演算子と関数の束を持つ文字列クラスであると考えられています。コンパイラがプライベートメンバーにアクセスできないと言っているので、その2つは私のためにいくつかの問題を引き起こします。ここに私のstring.hのは、次のとおりです。ここirrevelant機能のC++ friend関数がプライベートメンバーにアクセスできない

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

たくさん...ここ

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'は非公開です。 エラー: 'unsigned int MyStr :: Str :: length'は非公開です。 – 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とみなされます。

定義する演算子はグローバル名前空間にあります。そのため、コンパイラはそれらが2つの全く異なる演算子であり、友人ではないと考えています。

あなたは.cppファイルにオペレーターの周り

namespace MyStr 
{ 

} 

を追加することによってこの問題を解決することができます。

+0

それは働いた!どうもありがとうございます。私はこれらの名前空間を使う方法を学ばなければならない... – spinakker

+0

私はこれを試していて、うまくいかない - http://liveworkspace.org/code/4yc7Hy$3217 – 0x499602D2

+0

@David - それは違う。あなたはメインの 's.x'にアクセスしようとします、そして、メインはクラスの友人ではありません。 –

関連する問題