2013-03-31 37 views
11

Đây được coi là một lớp chuỗi với một loạt các toán tử và hàm, bao gồm hai hàm người bạn. Và hai điều đó gây ra một số rắc rối cho tôi, bởi vì trình biên dịch nói rằng họ không thể truy cập vào các thành viên riêng tư. Dưới đây là string.h của tôi:Chức năng bạn bè C++ không thể truy cập các thành viên riêng

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

rất nhiều chức năng irrevelant đây ...

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

đây là 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; 
} 

Mã này sẽ không biên dịch, trình biên dịch tuyên bố rằng các thành viên Str là riêng tư.

+1

Bạn gặp phải lỗi gì? – 0x499602D2

+0

lỗi: 'char * MyStr :: Str :: dữ liệu' là riêng tư | lỗi: 'unsigned int MyStr :: Str :: length' là riêng tư | – spinakker

+0

Dòng nào phát ra lỗi đó? Là nó cho cả hai chức năng? – 0x499602D2

Trả lời

15

Bạn nên chú ý hơn đến không gian tên.

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

Bạn gặp lỗi do không gian tên chưa từng có. Nếu bạn muốn gắn bó với MyStr thì bạn nên thêm không gian tên MyStr vào quá tải người bạn nhà khai thác. Đây là cách bạn có thể thực hiện: (các toán tử phải được xác định trong không gian tên 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

Khi bạn khai báo hàm bạn bè bên trong Str, chúng được coi là nằm trong không gian tên bao quanh ngay lập tức, MyStr.

Toán tử bạn xác định nằm trong không gian tên chung, do đó trình biên dịch tin rằng đó là hai toán tử hoàn toàn khác nhau chứ không phải là bạn bè.

Bạn có thể giải quyết điều này bằng cách thêm

namespace MyStr 
{ 

} 

xung quanh các nhà khai thác trong file cpp.

+0

Đã hoạt động! Cảm ơn bạn rất nhiều. Tôi phải học cách sử dụng các không gian tên này ... – spinakker

+0

Tôi đang thử cách này và nó không hoạt động - http://liveworkspace.org/code/4yc7Hy$3217 – 0x499602D2

+0

@David - Điều đó khác. Bạn cố gắng truy cập 's.x' bên trong chính, và chính không phải là một người bạn của lớp. –

Các vấn đề liên quan