函数的奇怪行为

时间:2016-04-24 22:14:28

标签: c++ overloading

所以基本上我有一个重载函数来计算标准:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetY()-atome.y,2));
}

double Szabo::norme(Gaussienne gaussienneA, Gaussienne gaussienneB)
{
    return sqrt(pow(gaussienneA.GetX()-gaussienneB.GetX(),2.0) + pow(gaussienneA.GetY()-gaussienneB.GetY(),2.0) + pow(gaussienneA.GetZ()-gaussienneB.GetZ(),2.0));
}

Gaussienne& Atome(类和结构)的定义如下:

Atome:

struct Atome
{
    double x; double y; double z; double numeroAtomique;
};

Gaussienne:

#ifndef GaussienneHeader
class Gaussienne
{       
    protected:
        // attributs
        double alpha;
        double coordX,coordY,coordZ;
    public:
        // methodes:

            // Constructeurs:
            Gaussienne();
            Gaussienne(double alpha,double x, double y, double z);

            // Accesseurs:
            double GetAlpha() const; //return this->alpha
            double GetX() const; //return this coordX
            double GetY() const; // return this coordY
            double GetZ() const; // return this coordZ

};

#define GaussienneHeader
#endif

所以现在,我想计算两个高斯A&的中心之间的标准。 B,原子位于(0,0,0);

我创建了一个"占位符"像这样的高斯存储着名的中心坐标

Gaussienne gaussienneP(0,(gaussienneA.GetX()+gaussienneB.GetX())/2.0,(gaussienneA.GetY()+gaussienneB.GetY())/2.0,(gaussienneA.GetZ()+gaussienneB.GetZ())/2.0);

我称之为:

Szabo::norme(mygaussian,atome)

我得到的结果与调用时的结果不同:

/* using this constructor: Gaussienne(double alpha,double x, double y, double z) with a dummy alpha = 0; */
Szabo::norme(mygaussian,Gaussienne(0,atome.x,atome.y,atome.z)

幸运的是,我可以将我的结果与一些"佳能"程序,所以我知道两个高斯的norme函数返回了良好的结果,但另一个不是。

有人可以提供我并解释这个奇怪的行为吗?感谢

1 个答案:

答案 0 :(得分:1)

我认为错误就在这里:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetY()-atome.y,2));
}

y组件使用两次,应该是:

double Szabo::norme(Gaussienne gaussienne, Atome atome) {
    return sqrt(pow(gaussienne.GetX()-atome.x,2)+pow(gaussienne.GetY()-atome.y,2)+pow(gaussienne.GetZ()-atome.z,2));
}