#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中有更多的成员函数(所以我需要替代解决方案)。
最后,有人可以给我链接来解释编译器在它到来时的作用 通过前瞻性声明,声明,定义。
答案 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();
}