使用友元函数时,类型不完整错误

时间:2011-09-18 11:50:20

标签: c++

#include <stdio.h>
class B;

class A;

class A
{
    int a;
    friend int B::f();
};


class B
{
    int b;
    class A x;
public:
    int f();
};

int B::f()
{
    // ...
}

main()
{
    class B b;
    b.f();
}

错误:

a.cpp:9: error: invalid use of incomplete type ‘struct B’

a.cpp:2: error: forward declaration of ‘struct B’

通过在A之前放置B的定义,无法解决问题 B有一个A型的对象。

对于这个例子,让B成为朋友类会做,但在 我的真实代码我在B中有更多的成员函数(所以我需要替代解决方案)。

最后,有人可以给我链接来解释编译器在它到来时的作用 通过前瞻性声明,声明,定义。

3 个答案:

答案 0 :(得分:2)

B之前定义A,并将指向A的指针声明为B的成员数据:

class A; //forward declaration

class B
{
    int b;
    A  *px; //one change here - make it pointer to A
 public:
    int f();

};

class A
{    
    int a;
    friend int B::f();
};

或者,您可以让整个班级B成为A的朋友,这样您就不必将成员数据指针指向A

class B; //forward declaration

class A
{    
    int a;
    friend class B;
};

class B
{
    int b;
    A   x; //No change here 
 public:
    int f();

};

答案 1 :(得分:2)

你根本无法做你想做的事情。要在类A中创建该朋友函数声明,需要在定义类B之前知道类A的性质。要使类B包含类A的实例,必须在定义类A之前知道类B的性质。捉住22。

如果您将班级B设为班级A的朋友班,则前者不适用。如果您修改B以包含指向类A实例的指针或引用,则后者不适用。

答案 2 :(得分:0)

向前声明A类;定义B类;定义A类;定义B :: f。

#include <cstdio>
class A;


class B
{
int b;

public:
int f();
};

class A
{
int a;
friend int B::f();
};


int B::f()
{
}

main() 
{
class B b;
b.f();
}