C++ 使用友元函数时出现不完整的类型错误

C++ 使用友元函数时出现不完整的类型错误,c++,C++,将B的定义放在A之前并不能解决这个问题 B有一个类型为A的对象 在这个例子中,让B成为朋友类就可以了,但是在 我的真实代码在B中有更多的成员函数(所以我需要替代解决方案) 最后,有人能给我一些链接来解释编译器在编译时的功能吗 跨越正向声明、声明、定义。在a之前定义B,并将指向a的指针声明为B的成员数据: a.cpp:9: error: invalid use of incomplete type ‘struct B’ a.cpp:2: error: forward declaration of

将B的定义放在A之前并不能解决这个问题 B有一个类型为A的对象

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

最后,有人能给我一些链接来解释编译器在编译时的功能吗
跨越正向声明、声明、定义。

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

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

a.cpp:2: error: forward declaration of ‘struct B’
或者,您可以使整个类
B
成为
a
的朋友,这样您就不必使成员数据指针指向
a


你根本不能做你想做的事情。要在类
A
中声明友元函数,需要在定义类
A
之前了解类
B
的性质。要使类
B
包含类
A
的实例,必须在定义类
B
之前了解类
A
的性质。第二十二条军规


如果将类
B
设置为类
a
的朋友类,则前者不适用。如果将
B
修改为包含指向类
a
实例的指针或引用,则后者不适用;定义B类;定义A类;定义B::f

class B; //forward declaration

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

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

};
#包括
甲级;
B类
{
int b;
公众:
int f();
};
甲级
{
INTA;
friendintb::f();
};
intb::f()
{
}
main()
{
乙级;
b、 f();
}

问题是C++编译器是“一通”,意思是它不会试图保留一些现在不能理解的东西,当它有更多信息时(在这个例子中,关于B类),以后尝试解决它。我不明白为什么现在还是这样。无论如何,据我所知,让B成为a班的朋友是可行的。或者你的意思是你必须允许访问B之外的其他成员功能?@Baltasarq:想象一下,同一段代码被编译成不同的东西,这取决于后面的内容。哪种编译语言具有这种“特性”?@eudoxos:Java,就是其中之一。它的语法需要一个多通道编译器。C++用于另一个(但仅在一个类内)。例如,
类Foo{public:set_item(int-val){item=val;}private:int-item;}未定义的行为,main的返回类型必须为
int
,并且仅int@eudoxos:David Hammen建议使用Java,这是一个很好的例子。我更深入地了解了C#,在这种情况下,首先只使用类成员的存根编译给定模块,以便在存在循环依赖时能够解决外部引用,最后,一旦所有检查都正常,所有模块都将使用所有代码编译。
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();
};
class B; //forward declaration

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

class B
{
    int b;
    A   x; //No change here 
 public:
    int 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();
}