我正在学习朋友的功能(C ++),但我无法理解为什么这个cose不起作用。我明白了
错误:“错误C2027:使用未定义类型'second'”。 (第6行)
这只是一个例子(无用)。我试图使用另一个类的成员函数作为朋友(只是那个函数)。我在网上找到了一些例子。但是在这里有一篇老帖子,有人说另一个班级的成员函数不能成为班级的朋友。这是真的吗?
#include<iostream>
using namespace std;
class second;
class test
{
friend void second::fun(test &);
public:
int j = 89;
private:
int t = 12;
};
class second
{
public:
void fun(test &b)
{
cout << "Try " << b.j << endl;
}
int a = 29;
private:
int u = 10;
};
int main()
{
test b;
second one;
one.fun(b);
return 0;
}
答案 0 :(得分:0)
要访问second::fun
,需要second
的完整定义。如果颠倒顺序,您可以在此处定义这些类并转发声明test
,则可以解决此问题。但同样,b.j
要求定义test
,因此您必须分离和推迟 second::fun
的定义:
#include<iostream>
using namespace std;
class test;
class second
{
public:
void fun(test &b); // test must be declared for using a reference to it
int a = 29;
private:
int u = 10;
};
class test
{
friend void second::fun(test &); // second must be defined to access its member
public:
int j = 89;
private:
int t = 12;
};
void second::fun(test &b)
{
cout << "Try " << b.j << endl; // test must be defined to access its member
}
int main()
{
test b;
second one;
one.fun(b);
return 0;
}
答案 1 :(得分:0)
尝试以下方法:
class test;
class second
{
public:
void fun(test &b);
int a = 29;
private:
int u = 10;
};
class test
{
friend void second::fun(test &);
public:
int j = 89;
private:
int t = 12;
};
void second::fun(test &b)
{
cout << "Try " << b.j << endl;
}
答案 2 :(得分:0)
您的代码存在一些问题。对于
friend void second::fun(test &);
为了工作,编译器必须知道second
是什么。由于它是一个不完整的类型,您将收到编译器错误。为了解决这个问题,您需要在测试之前声明second
。这样做会带来另一个问题
second::fun(test &b)
使用test
。要解决此问题,我们会转发声明test
,然后声明second
。更改后,您需要将实际的功能定义移出second
,并在test
之后使用。
#include<iostream>
using namespace std;
class test;
class second
{
public:
void fun(test &b);
int a = 29;
private:
int u = 10;
};
class test
{
friend void second::fun(test &);
public:
int j = 89;
private:
int t = 12;
};
void second::fun(test &b)
{
cout << "Try " << b.j << endl;
}
int main()
{
test b;
second one;
one.fun(b);
return 0;
}
答案 3 :(得分:0)
编译器读取此行时
friend void second::fun(test &);
它不知道第二类确实是否具有数据成员fun
。为了确保此行正确,编译器需要类second
的定义。
另一方面,函数fun
的定义必须知道类test
具有数据成员j
。
要解决冲突,您可以按以下方式编写
#include<iostream>
using namespace std;
class test;
class second
{
public:
void fun(test &b); // class test is already declared above
int a = 29;
private:
int u = 10;
};
class test
{
friend void second::fun(test &); //class second is already defined above
public:
int j = 89;
private:
int t = 12;
};
void second::fun(test &b)
{
cout << "Try " << b.j << endl; // class test is already defined above
}
int main()
{
test b;
second one;
one.fun(b);
return 0;
}