首页 文章

C友功能无法访问私人会员

提问于
浏览
11

这应该是一个包含一堆运算符和函数的字符串类,包括两个友元函数 . 这两个对我来说有些麻烦,因为编译器说他们无法访问私有成员 . 这是我的string.h:

#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 成员是私有的 .

2 回答

  • 16

    您应该更加关注命名空间 .

    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 .

    您定义的运算符位于全局命名空间中,因此编译器认为这些是两个完全不同的运算符,而不是朋友 .

    您可以通过添加来解决此问题

    namespace MyStr
    {
    
    }
    

    围绕.cpp文件中的运算符 .

相关问题