C++循环引用,使用方法时出错,即使在前向声明之后也是如此

发布于 2024-12-14 01:45:43 字数 424 浏览 0 评论 0原文

假设我有:

class B;
class A{
    private:
        B *b;
    public:
        bar(){ b->foo()};
        foo();
}

class B{
    private:
        A *a;
    public:
        bar(){ a->foo();}
        foo();
}

编译时此文件给出一个

错误“不完整类型结构 B 的无效使用”,

即使在我向前声明了类 B 之后也是如此。据我了解,这是因为当我在 b 上调用函数 foo(),编译器仍然不知道这样的函数存在。我该如何解决这个问题?

Suppose I have:

class B;
class A{
    private:
        B *b;
    public:
        bar(){ b->foo()};
        foo();
}

class B{
    private:
        A *a;
    public:
        bar(){ a->foo();}
        foo();
}

When compiled this file gives an

error "invalid use of incomplete type struct B",

even after I have forward declared the class B. As far as I understand it is because when I am calling the function foo() on b, the compiler still doesn't know that such a function exists. How can I solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泅渡 2024-12-21 01:45:43

前向声明没有提供实现细节。 A 不知道 B,只知道它存在。

要解决此问题,请将声明与实现分开。

您还缺少方法的返回类型。

文件 Ah:

class B;
class A{
    private:
        B *b;
    public:
        void bar();
        void foo();
};

文件 A.cpp:

#include "A.h"
#include "B.h"
void A::bar(){ 
   b->foo();
}

文件 Bh:

class A;
class B{
    private:
        A *a;
    public:
        void bar();
        void foo();
};

文件 B.cpp:

#include "B.h"
#include "A.h"
void B::bar(){ 
   a->foo();
}

The forward declaration provides no implementation details. B is not known to A, other than the fact that it exists.

To solve this, separate your declaration from the implementation.

You're also missing return types for the methods.

File A.h:

class B;
class A{
    private:
        B *b;
    public:
        void bar();
        void foo();
};

File A.cpp:

#include "A.h"
#include "B.h"
void A::bar(){ 
   b->foo();
}

File B.h:

class A;
class B{
    private:
        A *a;
    public:
        void bar();
        void foo();
};

File B.cpp:

#include "B.h"
#include "A.h"
void B::bar(){ 
   a->foo();
}
终弃我 2024-12-21 01:45:43

将实现放在源文件中而不是标头中。

Put the implementation in a source file instead of in the header.

梦里寻她 2024-12-21 01:45:43

该错误是因为您尝试在 A::bar 中使用 B 中的方法。虽然类 B声明,但尚未定义

就像其他人说的那样,您应该将定义和实现分开,它就会起作用。

The error is because you try to use a method from B in A::bar. While class B has been declared, it has not been defined.

Like the others say, you should separate the definition and the implementation, and it will work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文