c++ 某个类方法中的参数声明有问题[重复]

fcg9iug3  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(158)
    • 此问题在此处已有答案**:

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.

cedebl8k

cedebl8k1#

你需要一个“forward declaration”,就像这样

class Spheric; // forward declaration

class Decard
{
    ...
    void ToMe(const Spheric& S); // not defined yet
    ...
};

class Spheric
{
    ...
};

// now Decard::ToMe can be defined
inline void Decard::ToMe(const Spheric& S)
{
    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());
}

foeward声明允许你提及类Spheric,但不能使用它,所以Decard::ToMe的定义必须推迟到两个类都完全定义之后。

相关问题