2013-01-09 72 views
1

我有一個形狀類,我從我的main程序初始化並給出構造函數中的參數。從類函數中更改int值

Shape *cusomShape = new CustomShape(float radius, float origin)

形狀類有一些諸如翻轉和更多的功能。
當形狀類內部的翻轉功能被觸發時,我想更改main程序中的某個int值。這可能類似於觸發翻轉函數時觸發更改值的事件,但我不確定如何在C++中執行此操作。如果有的話,事件在這裏是理想的方式,很快我們會看到一個簡短的例子。

如果使用該事件不是正確的,那麼對此的理想方式是什麼?

+1

觀察者模式? –

+2

爲什麼你使用'float'而不是默認'double'?你爲什麼動態分配形狀?你怎麼能談論你的類中的事件處理程序被「解僱」,並且不確定如何在C++中執行事件? –

回答

3

我認爲你需要的是通過指針或參考形狀中的函數傳遞一個值,然後修改它。如果該函數不是從main調用的,而是從其他地方傳過來的,指針是更好的選項。首先傳遞指向類的指針並使用另一種方法存儲它,然後每次調用rollover時都利用它。

編輯:例如:

class CustomShape { 

void storePointer(int* _value) { 
    value = _value; 
} 

void rollover() { 
    .. do stuff 
    *value++; // for instance 
    ... do stuff 
} 
int * value; 
} 


int main() { 
    int a; 

    CustomShape cs; 
    cs.storePointer(&a); 

    .... 
    cs.rollover(); 
    .... 
    return 0; 
} 
+0

傳遞參考因爲使用觀察者模式會在這裏矯枉過正? – user1240679

+0

我這麼認爲。取決於你想要做什麼,但如果這只是我在我的例子中展示的內容,這應該是你需要的。 –

2

傳遞給在構造函數中變量的引用,並保存該引用。需要時更改該值。

0

我會建議將變量的引用傳遞給需要更改其值的成員函數。在類中存儲引用可將Shape類與參考結合起來。這意味着每次你想使用Shape時,如果不更新整數,你不能,因爲Shape構造函數會期望引用int指針作爲參數(Shape類將存儲指針/引用作爲屬性) 。將參考/指針傳遞給成員函數會促進低耦合

#include <iostream> 

class Shape 
{ 
    double shapeValue_; 

    public: 
     Shape (double value) 
      : 
       shapeValue_(value) 
     {} 

     void fireFunction(int& updateMe) 
     { 
      updateMe = 123; 
     } 
}; 

using namespace std; 

int main() 
{ 
    int update; 

    cout << update << endl; 

    Shape s(4.5); 

    s.fireFunction(update); 

    cout << update << endl; 

    return 0; 
}; 

在這種情況下,你有不涉及形狀對象調用fireFunction主程序一個選項:

int main() 
{ 
    Shape s(4.5); 

    // Main program that doesn't use fireFunction. 

    return 0; 
}; 

在這種情況下,如果有成員函數改變輸入參數,你應該採取一種定義這種功能的風格:例如,確保由成員函數改變的變量始終是其聲明中的第一個輸入參數。

如果您希望複雜的對象在彼此之間進行更新通信,則可以使用Observer Pattern