C++ 使用友元函数时出现不完整的类型错误
将B的定义放在A之前并不能解决这个问题 B有一个类型为A的对象 在这个例子中,让B成为朋友类就可以了,但是在 我的真实代码在B中有更多的成员函数(所以我需要替代解决方案) 最后,有人能给我一些链接来解释编译器在编译时的功能吗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
跨越正向声明、声明、定义。在
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();
}