- 此问题在此处已有答案**:
Resolve build errors due to circular dependency amongst classes(12个答案)
2天前关闭。
我试着用类而不是结构来写一些代码(教授给我们的一些任务),任务是从笛卡尔转换为球形,反之亦然,所以不要麻烦一些细节(命名空间,封装...),在这个例子中没有强调。我遇到了一个非常愚蠢的错误,我还没有看到,到目前为止,不幸的是我无法解决它。
如果你注意你会发现有两个方法有相同的名字(ToMe(...)),甚至参数(唯一的区别是参数类型).当我运行这个代码与声明的ToMe过程在Decard类注解我得到想要的结果,但当我想运行它在这个形状,它说:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2143: syntax error: missing ',' before '&'
error C2065: 'S': undeclared identifier
有人知道为什么它总是坏吗?
#include<iostream>
#include<math.h>
using namespace std;
class Decard
{
double m_x;
double m_y;
double m_z;
public:
Decard() :m_x{0}, m_y{ 0 }, m_z{ 0 } {}
Decard(double x, double y, double z) :m_x{ x }, m_y{ y }, m_z{ z }{}
double GetX() const { return m_x; }
double GetY() const { return m_y; }
double GetZ() const { return m_z; }
void Ucitaj()
{
cout << "Unesite koordinate tacaka u dekartovom koordinatnom sistemu x,y, i z respektivno" << endl;
cin >> m_x >> m_y >> m_z;
}
void ToMe(const Spheric& S) //THIS IS THE LINE THAT MAKES PROBLEMS
{
m_x = S.GetR() * sin(S.GetTheta()) * cos(S.GetPhi());
m_y = S.GetR() * sin(S.GetTheta()) * sin(S.GetPhi());
m_z= m_x = S.GetR() * cos(S.GetTheta());
}
void Print()
{
cout << "U dekartovom :" << endl;
cout << "X:" << m_x << endl << "Y:" << m_y << endl << "Z:" << m_z << endl;
}
};
class Spheric
{
double m_r;
double m_phi;
double m_theta;
public:
Spheric() :m_r{ 0 }, m_phi{ 0 }, m_theta{ 0 } {}
Spheric(double x, double y, double z) :m_r{ x }, m_phi{ y }, m_theta{ z }{}
void Ucitaj()
{
cout << "Unesite koordinate tacaka u sfernom koordinatnom sistemu r,fi, i teta respektivno" << endl;
cin >> m_r >> m_phi >> m_theta;
}
void Print()
{
cout << "U sfernom :" << endl;
cout << "R:" << m_r << endl << "Phi:" << m_phi << endl << "Theta:" << m_theta<< endl;
}
void ToMe(const Decard& D)
{
m_r = sqrt(pow(D.GetX(), 2) + pow(D.GetY(), 2) + pow(D.GetZ(), 2));
m_phi = atan(D.GetY() / D.GetX());
m_theta = atan(D.GetZ() / m_r);
}
double GetR() const { return m_r; }
double GetPhi() const { return m_phi; }
double GetTheta() const { return m_theta; }
};
int main()
{
Decard D{ 1,2,3 };
Spheric S;
S.ToMe(D);
S.Print();
D.ToMe(S);
D.Print();
return 0;
}
我所尝试的是将过程的定义放在类之外:
void Decard::ToMe(const Spheric& S)
{
.
.
.
}
我看到了一些有趣的东西,Visual Studio指出这个被替换的定义的参数类型与过程声明中的"const & S"不匹配。<error_type> &S" in the declaration of the procedure.
1条答案
按热度按时间cedebl8k1#
你需要一个“forward declaration”,就像这样
foeward声明允许你提及类
Spheric
,但不能使用它,所以Decard::ToMe
的定义必须推迟到两个类都完全定义之后。