2013-03-31 2 views
11

이것은 두 개의 friend 함수를 포함하여 많은 연산자와 함수가있는 문자열 클래스입니다. 컴파일러가 사적인 멤버들에게 접근 할 수 없다고 말했기 때문에이 두가지는 저에게 약간의 문제를 일으 킵니다. 여기 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한다 : 여기 내 string.h이

#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'비공개 | 오류 : '부호없는 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으로 간주됩니다.

정의한 연산자는 전역 네임 스페이스에 있으므로 컴파일러는 해당 연산자가 친구가 아니라 완전히 다른 두 연산자라고 생각합니다.

당신은 .cpp 파일에 사업자 주위

namespace MyStr 
{ 

} 

를 추가하여이 문제를 해결할 수 있습니다.

+0

그것은 일했다! 정말 고맙습니다. 나는이 네임 스페이스를 사용하는 법을 배워야 만한다 ... – spinakker

+0

나는 이것을 시도하고 있지만 작동하지 않는다. - http://liveworkspace.org/code/4yc7Hy$3217 – 0x499602D2

+0

@David - 그건 다르다. main 내부에서's.x'에 접근하려고 시도하고, main은 클래스의 친구가 아닙니다. –

관련 문제