2014-11-14 122 views
0

我必須使用相同的雙打,即像在不同的功能

在.H

我宣佈

class MyClass : { 
public : 

    double arg1, arg2; 

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

,並在我的.CI有類似

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

'arg1'和'arg2'沒有初始化。你想實現什麼? – harper 2014-11-14 16:21:16

+0

剛剛編輯我的第一篇文章 - 謝謝 – 2014-11-14 16:23:31

+1

我想你可能需要'arg3'和'arg4'(在一些初始化之上)。 – Galik 2014-11-14 16:26:15

回答

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,ARG2從getVarB

編輯 據@harper評論,強烈建議,以避免未初始化的變量。您不能假設初始值爲arg1arg2變量。你應該明確設定初始值

double arg1 = 0.0; 
double arg2 = 0.0; 
+0

更改。您是否建議這種未定義的行爲? – harper 2014-11-14 16:22:15

+0

作者已經有未初始化變量導致的UB。我只是回答了作者的問題 – nnesterov 2014-11-14 16:24:00

+0

是的,但是如果從初始函數內部調用另一個函數,局部變量將不起作用,對吧? – 2014-11-14 16:30:17

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以通知編譯器您不希望數據成員實際上被您的方法修改。

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,以匹配實現。