在不同的功能中使用相同的double

时间:2014-11-14 16:18:37

标签: c++

我有两个使用相同双打的功能,例如

在.h我宣布

class MyClass :  {
public :

    double arg1, arg2;

    void getVarA(double a, double b);
    void getVarB(double a, double b);
    void Reset();
}

在我的.C中我有类似

的东西
void MyClass::Reset(){
    arg1 = 0.0f;
    arg2 = 0.0f;
}

void MyClass::getVarA(double a, double b){

    arg1+=2*a;
    arg2+=2*b;

    return arg1-arg2;
}


void MyClass::getVarB(double a, double b){

    arg1+=2+a;
    arg2+=2+b;

    return arg1-arg2;
}

问题在于原则上我想创建一个arg1的副本,arg2每个都在每个函数中取值(即在每个函数中都可以取不同的值),这样arg1,arg2就不会“说话”了两个不同的函数,每当我更改getVarA函数中的arg1时,不要与getVarB函数中的arg1通信。

对不起,可能我的例子很差,但我只是新手..

感谢

3 个答案:

答案 0 :(得分:0)

将变量arg1,arg2作为函数局部变量。

void MyClass:getVarA(double a, double b) {
    double arg1, arg2;

    arg1+=2*a;
    arg2+=2*b

    return arg1-arg2
}


void MyClass:getVarB(double a, double b) {
    double arg1, arg2;

    arg1+=2+a;
    arg2+=2+b

    return arg1-arg2
}

它们将成为不同的变量。 getVarA arg1,arg2中所做的任何更改都不会影响arg1,来自getVarB的arg2

修改 根据@harper评论,强烈建议避免使用未初始化的变量。您不能假设arg1arg2变量的初始值。你应该明确设定初始值

double arg1 = 0.0;
double arg2 = 0.0;

答案 1 :(得分:0)

“问题是原则上我想创建一个arg1,arg2”

的副本

你可以做到这一点:

void MyClass::getVarA(double a, double b)
{
    double arg1Copy = arg1;
    double arg2Copy = arg2;
    arg1Copy+=2*a;
    arg2Copy+=2*b;

    return arg1Copy-arg2Copy;
}

现在你的方法不会修改arg1和arg2。实际上,您甚至可以将方法声明为const,以通知编译器您不希望您的方法实际修改数据成员。

答案 2 :(得分:0)

这个答案基于您对问题的以下解释:

  • 每个getVar函数都应该记住以前的调用。函数调用返回的值应该根据过去对该函数的调用而改变。例如,如果您运行此代码,则x1x2将具有不同的值:

    MyClass mc;
    double x1 = mc.getVarA(1,1);
    double x2 = mc.getVarA(1,1);
    

    如果您希望x1x2具有不同的值(因为第一次调用应该更改第二次调用中使用的值),那么这个答案是合适的。如果您希望x1x2具有相同的值(因为您不希望getVarA记住以前函数调用的任何内容),nnesterov建议使用局部变量是一个比这个更好的答案。

  • 你想要记住调用getVarA独立于getVarB调用的记忆。

考虑到这一点,这是.h:

class MyClass {
public :

    double _varA1, _varA2;
    double _varB1, _varB2;

    MyClass();
    double getVarA(double a, double b);
    double getVarB(double a, double b);
    void Reset();
};

这是.c:

MyClass::MyClass(){
    Reset();
}

void MyClass::Reset(){
    _varA1 = 0.0;
    _varA2 = 0.0;
    _varB1 = 0.0;
    _varB2 = 0.0;
}

double MyClass::getVarA(double a, double b){

    _varA1 += 2*a;
    _varA2 += 2*b;

    return _varA1 - _varA2;
}

double MyClass::getVarB(double a, double b){

    _varB1 += 2+a;
    _varB2 += 2+b;

    return _varB1 - _varB2;
}

需要注意的事项:

  • 两个get函数中的每一个都有自己的一组实例变量。这样,您可以更改一个函数的数据,而无需更改其他函数的数据。
  • 构造函数调用Reset(),以便在首次创建类的实例时初始化变量。这样,您就可以预测第一次调用每个get函数时会发生什么。
  • get函数的返回类型已更改为double,以匹配实现。