这应该是一个带有一堆运算符和函数的字符串类,包括两个友元函数。这两个对我来说有些麻烦,因为编译器说他们无法访问私有成员。这是我的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
成员是私有的。
答案 0 :(得分:17)
你应该更多地关注命名空间。
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;
}
}
答案 1 :(得分:7)
当您在Str
中声明好友函数时,它们被认为位于紧邻的名称空间MyStr
中。
您定义的运算符位于全局命名空间中,因此编译器认为这些是两个完全不同的运算符,而不是朋友。
您可以通过添加
来解决此问题namespace MyStr
{
}
围绕.cpp文件中的运算符。