C++;交织的#包括 首先,我是C++初学者。第二,很抱歉,这篇文章太长了。我有几个类相互利用,类似于这张图片(速写):

C++;交织的#包括 首先,我是C++初学者。第二,很抱歉,这篇文章太长了。我有几个类相互利用,类似于这张图片(速写):,c++,class,include,C++,Class,Include,这是一个可用代码的快速草图。这些公式都是假的,但其功能与实际问题非常接近。为了简单起见,我省略了制作源文件。#includes与上次编译后一样,上次编译使我的错误最少 “y.h” “b.h” “x.h” “main.cpp” #包括“x.h” #包括 int main() { X检验{3.14,0.618,1.618,1}; std::cout在Y和A中无效使用不完整的类型“class…” 在类Y中使用#include a.h向后执行,然后在类a中使用#include x.h,类x没有#

这是一个可用代码的快速草图。这些公式都是假的,但其功能与实际问题非常接近。为了简单起见,我省略了制作源文件。
#includes
与上次编译后一样,上次编译使我的错误最少


“y.h”


“b.h”


“x.h”


“main.cpp”

#包括“x.h”
#包括
int main()
{
X检验{3.14,0.618,1.618,1};
std::cout
在Y和A中无效使用不完整的类型“class…”

  • 在类Y中使用
    #include a.h
    向后执行,然后在类a中使用
    #include x.h
    ,类x没有
    #include
    ,向前声明=>
    在类x中的嵌套名称spacifier
    中使用了不完整的类型a,指向
    x():{int x{a::funcA()}

  • 如上所述,没有转发声明意味着到处都是错误

  • 网上的搜索说这是因为循环依赖,但这怎么可能,因为我只包括上一个或下一个,从来没有两个?有答案说使用
    #pragma一次
    而不是通常的方法可以解决问题,我尝试过,这是相同的
    不完整类型…
    。仅供参考,我也试图查看一些源代码(wxMaxima,audacious),看看他们是如何做到的,似乎他们使用了我的第一种方法


    在这一点上,我很困惑。如果以上可以作为一个答案,有人能给我一些关于如何正确使用这里的
    #includes
    的指导吗?如果没有,请留下评论,如果需要,我会删除这个。

    首先,请提供你的代码。第二,“X类使用a类”不清楚。
    X
    是源于
    A
    还是保留对其实例的引用?第三,您决定提供类关系的图形表示非常好,因此您可以进一步学习bit@mvidelgauz谢谢你的通知,我会尽量减少可用代码。这是否意味着我必须从零开始编辑问题?如,删除,重拍?你应该可以编辑你的问题,你的问题下没有“编辑”链接吗?@mvidelgauz我有,但如果我这样做,这意味着几乎改变了一切。很可能已经读过这篇文章的人不会再尝试阅读它。无论如何,我现在正在重新思考,看看它会走向何方。1。开始回答的人将看到“问题已被编辑”消息,而无需重新加载页面-因此非常聪明,可以将其设置为。)2.您的问题始终保留在“未回答”列表中,因此使其措辞和格式更好只会提高获得好答案的机会,请提供您的代码。第二,“X类使用A类"不清楚。
    X
    是源于
    A
    还是保留对其实例的引用?第三,您决定提供类关系的图形表示非常好,因此您可以进一步学习bit@mvidelgauz谢谢你的通知,我会尽量减少可用代码。这是否意味着我必须从零开始编辑问题?如,删除,重拍?你应该可以编辑你的问题,你的问题下没有“编辑”链接吗?@mvidelgauz我有,但如果我这样做,这意味着几乎改变了一切。很可能已经读过这篇文章的人不会再尝试阅读它。无论如何,我现在正在重新思考,看看它会走向何方。1。将开始回答的人将看到“问题已编辑”消息,而无需重新加载页面-因此非常聪明,可以将其设置为。)2.您的问题始终保留在“未回答”列表中,因此使其措辞和格式更好只会提高获得好答案的机会
    #pragma once
    
    #include "a.h"
    #include "b.h"
    
    class X;
    class A;
    class B;
    
    class Y
    {
    private:
        double m_y;
    public:
        Y(double b, double c):
        {
            if (c)
                m_y = b*b;
            else
                m_y = sqrt(b);
            if (b<0)
            {
                A::setP(m_y);
                A::setQ(m_y + 1);
                A::setR(m_y - 1);
            }
            else
            {
                B::setP(m_y);
                B::setQ(m_y + 1);
                B::setR(m_y - 1);
            }
        }
    
    #pragma once
    
    #include "x.h"
    
    class X;
    
    class A : virtual public X
    {
    private:
        double m_p, m_q, m_r;
    public:
        A(double a, double b): m_p {a*a}
        {
            m_q = m_p + 0.5 * b;
            m_r = m_q - m_p;
        }
    
        void setP(double p) { m_p = p; }
        void setQ(double q) { m_q = q; }
        void setR(double r) { m_r = r; }
    
        double getP() { return m_p; }
        double getQ() { return m_q; }
        double getR() { return m_r; }
    };
    
    #pragma once
    
    #include "x.h"
    
    class X;
    
    class B : virtual public X
    {
    private:
        double m_p, m_q, m_r;
    public:
        B(double a, double b): m_p {a + a}
        {
            m_q = m_p*m_p;
            m_r = b + m_q;
        }
    
        void setP(double p) { m_p = p; }
        void setQ(double q) { m_q = q; }
        void setR(double r) { m_r = r; }
    
        double getP() { return m_p; }
        double getQ() { return m_q; }
        double getR() { return m_r; }
    };
    
    //#include "a.h"
    
    class A;
    class B;
    
    class X
    {
    private:
        double m_x1, m_x2;
    public:
        X(double a, double b, double c, int d): m_x1 {2*a}
        {
            double p, q, r;
            switch (d)
            {
            case 1:
                p = A::getP();
                q = A::getQ();
                r = A::getR();
                m_x2 = p * b + q * c - r;
                break;
            case 2:
                p = B::getP();
                q = B::getQ();
                r = B::getR();
                m_x2 = (p - q) * b + r / c;
                break;
            }
        }
    
        double getX1() { return m_x1; }
        double getX2() { return m_x2; }
    };
    
    #include "x.h"
    #include <iostream>
    
    int main()
    {
        X test {3.14, 0.618, 1.618, 1};
        std::cout << test.getX1() << '\t' << test.getX2() << '\n';
        return 0;
    }