C++ 转发声明和类

C++ 转发声明和类,c++,class,forward-declaration,C++,Class,Forward Declaration,我正在处理一种情况,我试图定义两个相互依赖的类。这是我正在尝试做的一个简化示例 class a{ public: int ia; int printb(b in){ return in.ib; } }; class b{ public: int ib; int printb(a in){ return in.ia; } }; 这给了我未定义的b类错误。我试过了 class b; class a{ public:

我正在处理一种情况,我试图定义两个相互依赖的类。这是我正在尝试做的一个简化示例

class a{
public:
    int ia;
    int printb(b in){
        return in.ib;
    }
};

class b{
public:
    int ib;
    int printb(a in){
        return in.ia;
    }
};
这给了我未定义的b类错误。我试过了

class b;

class a{
public:
    int ia;
    int printb(b in){
        return in.ib;
    }
};

class b{
public:
    int ib;
    int printb(a in){
        return in.ia;
    }
};

但这并不能解决问题。有什么想法吗?

您所要做的就是将成员函数的实现保持在类定义之外。然后,您可以确保在实现成员之前定义了这两个类:

class b;

class a{
public:
    int printb(b in);
    int ia;
};

class b{
public:
    int ib;
    int printb(a in);
};

int a::printb(b in){
        return in.ib;
    }
int b::printb(a in){
        return in.ia;
    }

您所要做的就是将成员函数的实现保持在类定义之外。然后,您可以确保在实现成员之前定义了这两个类:

class b;

class a{
public:
    int printb(b in);
    int ia;
};

class b{
public:
    int ib;
    int printb(a in);
};

int a::printb(b in){
        return in.ib;
    }
int b::printb(a in){
        return in.ia;
    }

想想看:编译器应该如何知道
在.ib中返回什么表示不知道
b
的定义?在定义
a::printb
之前,必须先定义
b
。因此,只需在类中声明子例程,然后在以后定义它们?是的。这可能是个骗局,但我也不知道如何搜索/我相信它叫。一般来说,它只是意味着程序设计中的一个缺陷。@BaummitAugen没有看到公共声明思考一下:编译器如何知道
在.ib中返回什么表示不知道
b
的定义?在定义
a::printb
之前,必须先定义
b
。因此,只需在类中声明子例程,然后在以后定义它们?是的。这可能是个骗局,但我也不知道如何搜索/我相信它叫。一般来说,这只意味着程序设计中存在缺陷。@BaummitAugen没有看到公共声明。两个成员函数可能应该标记为
inline
,以与原始代码一致。如果这实际上是一个头文件,也有必要。两个成员函数可能应该标记为
inline
,以与原始代码一致。如果这实际上是一个头文件,那么也是必要的。