我有两个使用相同双打的功能,例如
在.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通信。
对不起,可能我的例子很差,但我只是新手..
感谢
答案 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评论,强烈建议避免使用未初始化的变量。您不能假设arg1
和arg2
变量的初始值。你应该明确设定初始值
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
函数都应该记住以前的调用。函数调用返回的值应该根据过去对该函数的调用而改变。例如,如果您运行此代码,则x1
和x2
将具有不同的值:
MyClass mc;
double x1 = mc.getVarA(1,1);
double x2 = mc.getVarA(1,1);
如果您希望x1
和x2
具有不同的值(因为第一次调用应该更改第二次调用中使用的值),那么这个答案是合适的。如果您希望x1
和x2
具有相同的值(因为您不希望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,以匹配实现。