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;
}