C ++错误C2027:使用未定义类型'second'(朋友类)

时间:2015-12-10 16:52:31

标签: c++ class friend-function

我正在学习朋友的功能(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;
}

4 个答案:

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

Live Example

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